具有弹簧安全性的外部SSO

时间:2019-05-20 23:18:17

标签: java spring spring-boot spring-security

我正在开发一个需要将专有SSO与spring security集成在一起的应用程序。该应用程序使用spring boot,并且要求我们使用内部专有SSO模块的身份验证和现有应用程序的授权。现有应用程序的身份验证系统必须替换为内部专有SSO的身份验证模块。我浏览了一些文档,并了解到弹簧是基于模块的,这是可能的。

在处理应用程序时,我注意到我们正在使用FilterRegistrationBean初始化一个过滤器,并通过WebSecurityConfigurerAdapter的configure(HttpSecurity http)方法将另一个过滤器添加到链中。

有人可以让我知道这是否将被视为两个不同的链吗?如果是这样,如何检查链以过滤出细节?

我能否仅删除通过WebSecurityConfigurerAdapter的configure(HttpSecurity http)方法添加的过滤器,并使用内部专有SSO的过滤器(优先级最高)替换通过FilterRegistrationBean注册的现有过滤器?

1 个答案:

答案 0 :(得分:0)

好的,所以我们可以完全按照您在我们的系统之一中的要求进行操作。我们在Spring Boot 1和Spring Boot 2中进行了这项工作。这些是要执行的步骤。

创建一个扩展AbstractPreAuthenticatedProcessingFilter的bean。实施getPreAuthenticatedPrincipalgetPreAuthenticatedCredentials,以从您的SSO系统中提取经过身份验证的用户和可选凭据(例如证书)。为此过滤器bean创建一个FilterRegistrationBean,否则,由于spring boot的组件扫描,它将最终出现在主过滤器​​链和安全过滤器链中。

创建一个实现AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken>的用户详细信息(授权)服务bean。覆盖loadUserDetails以获取经过身份验证的令牌,并使用它以GrantedAuthority列表的形式添加权限。

在您的WebSecurityConfigurerAdapter bean子类中,执行以下操作:

  1. 注入您的AbstractPreAuthenticatedProcessingFilter子类和AuthenticationUserDetailsService的子类。

  2. 添加类型为PreAuthenticatedAuthenticationProvider的类成员,并使用new(不是bean)对其进行初始化。

  3. configure(HttpSecurity)中,使用身份验证管理器初始化您的过滤器bean:yourBean.setAuthenticationManager(authenticationManager()),然后确保包含过滤器:

http.addFilter(yourBean)
  .authorizeRequests()
    .requestMatchers(...)
  1. 使用身份验证和授权Bean的实现覆盖configure(AuthenticationManagerBuilder)并初始化在步骤(2)中创建的PreAuthenticatedAuthenticationProvider
    this.preAuthProvider.setPreAuthenticatedUserDetailsService(this.userDetailsService);
    this.preAuthProvider.setThrowExceptionWhenTokenRejected(true);

    authBuilder.authenticationProvider(this.preAuthProvider);

应该就这些了。希望有帮助。