当前位置: 首页 > 面试题库 >

用于Siteminder的Spring Security Java Config

吴涵育
2023-03-14
问题内容

我有一个可以工作的inMemoryAuthentication配置:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(
            AuthenticationManagerBuilder authenticationManagerBuilder)
            throws Exception {

        authenticationManagerBuilder //
            .inMemoryAuthentication() //
                .withUser("employee") //
                    .password("employee") //
                    .roles("RoleEmployee")
        ;

    }

    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers("/resources/**");
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        // @formatter:off

        httpSecurity
            .authorizeRequests()
                .antMatchers("/login","/login.request","/logout").permitAll()
                .anyRequest().hasRole("RoleEmployee")
        .and()
            .formLogin()
                .loginPage("/login.request")
                .loginProcessingUrl("/login")
                .failureUrl("/login.request?error")
                .permitAll()
        .and()
            .logout()
                .logoutUrl("/logout")
                .permitAll()
                .logoutSuccessUrl("/login.request")
        ;

        // @formatter:on
    }
}

我现在想使用Siteminder身份验证并将其更改为:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {
    private UserDetailsService userDetailsService;  
    private PreAuthenticatedAuthenticationProvider preAuthenticatedProvider;

    public WebSecurityConfiguration() {
        super();

        userDetailsService = new CustomUserDetailsService();
        UserDetailsByNameServiceWrapper<PreAuthenticatedAuthenticationToken> wrapper = new UserDetailsByNameServiceWrapper<PreAuthenticatedAuthenticationToken>(
                userDetailsService);

        preAuthenticatedProvider = new PreAuthenticatedAuthenticationProvider();
        preAuthenticatedProvider.setPreAuthenticatedUserDetailsService(wrapper);
    }


    @Override
    protected void configure(
            AuthenticationManagerBuilder authenticationManagerBuilder)
            throws Exception {


        // @formatter:off
        authenticationManagerBuilder //
            .authenticationProvider(preAuthenticatedProvider);
        // @formatter:on
    }

    @Override
    public void configure(WebSecurity webSecurity) throws Exception {
        webSecurity.ignoring().antMatchers("/resources/**");
    }

    @Override
    protected void configure(HttpSecurity httpSecurity) throws Exception {
        // @formatter:off

        RequestHeaderAuthenticationFilter siteMinderFilter = new RequestHeaderAuthenticationFilter();
        siteMinderFilter.setAuthenticationManager(authenticationManager());

        httpSecurity
            .addFilter(siteMinderFilter)
            .authorizeRequests()
                .antMatchers("/login","/login.request","/logout").permitAll()
                .anyRequest().hasRole("RoleEmployee")
        .and()
            .formLogin()
                .loginPage("/login.request")
                .loginProcessingUrl("/login")
                .failureUrl("/login.request?error")
                .permitAll()
        .and()
            .logout()
                .logoutUrl("/logout")
                .permitAll()
                .logoutSuccessUrl("/login.request")
        ;

        // @formatter:on
    }
}

现在,CustomUserDetailsS​​ervice始终返回具有雇员角色的用户:

public class CustomUserDetailsService implements
        UserDetailsService {
    @Override
    public UserDetails loadUserByUsername(String username)
            throws UsernameNotFoundException {
        List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        SimpleGrantedAuthority authority = new SimpleGrantedAuthority("RoleEmployee");
        authorities.add(authority);

        UserDetails user = new User(username, "password", authorities);
        return user;    
    }
}

当我对此进行测试时,将正确传入SM_USER标头,并且可以在调试器中看到正确调用了CustomUserDetailsS​​erice,但是对于以前在旧配置下能够成功访问的任何页面,都返回403禁止状态。

此配置有问题吗?


问题答案:

通常,提出问题有助于回答问题。

变更:

anyRequest().hasRole("RoleEmployee")

至:

anyRequest().hasAuthority("RoleEmployee")

固定它。



 类似资料:
  • 是否有任何“开箱即用”的siteminder工具可以检查siteminder服务器/应用程序是否运行? 例如,我通过超文本传输协议:/mysiteminderApplication: myport/check_heartbeat.html的url发送请求,它会回复我实际状态,如ok、错误等。 抱歉,我从未见过siteminder安装,但我必须为客户检查这一事实。 提前谢谢你Patrick

  • 我必须给出使用Site Minder的SSO架构的建议。我们几乎没有J2EE应用程序。这些J2EE应用程序设计为在SSO提供者进行身份验证后,当http头包含信息时工作。我们一直保持应用程序SSO提供程序不可知。这意味着我们只依赖SSO提供程序的头。这在RSA作为SSO提供程序的情况下运行良好。 现在SiteMinder提出了另一种架构。请求的流动方式是 带IIS的SiteMinder- 要崩溃,

  • 下面使用Siteminder筛选器, @override protected void configure(HttpSecurity http)引发异常{http.AddFilterBefore(siteminderFilter(),RequestHeAderAuthenticationFilter.Class).........} @bean public RequestHeaderAuthen

  • 在我工作的地方,我们正在使用CA的Siteminder为我们的应用程序实现单一登录。我们遇到了用户在看似随机的时间后甚至在工作时“超时”的问题。 花了我们一段时间,但我们终于弄清楚了。Siteminder有一个名为“最大超时”的设置,它基本上会导致用户的会话在两小时后无效...... 我一辈子都搞不明白你到底用它干什么? 有什么想法吗?

  • 我是使用SiteMinder的新手,我想知道所有我需要阅读和理解的东西才能使用它。请相称好的参考资料。谢谢。

  • 我正在尝试编写一些代码来连接到使用Siteminder身份验证的HTTPS站点。 我一直得到401。有什么想法吗? 我在这里读了一些不同的东西,但没有一个看起来真的很有帮助。我也在使用Fiddler/Firefox Tamper来窥探发生了什么。 这是到目前为止我在代码方面得到的信息:

  • 我想在发布者的AEM 6中实现CA siteminder。它的工作方式是应用程序的最终用户将使用登录表单并进入应用程序。成功申请后,用户将登陆主页,在那里她将能够看到她的个人信息,如姓名、出生日期、病史和所有类型的数据。在提供错误的密码时,用户将收到错误消息。这就像任何正常的Web应用程序一样。这里的问题是所有用户信息都将来自后端,即Web服务。CRX中不会保存任何用户或最少的信息。我在sitem

  • 嗨,我需要检查siteminder的状态,看看它是否已关闭。我当前的解决方案是在指定的环境中ping siteminder的策略服务器。是否有任何方法可以使用c#检查Siteminder是否正常运行?提前感谢