我正在开发一个需要将专有SSO与spring security集成在一起的应用程序。该应用程序使用spring boot,并且要求我们使用内部专有SSO模块的身份验证和现有应用程序的授权。现有应用程序的身份验证系统必须替换为内部专有SSO的身份验证模块。我浏览了一些文档,并了解到弹簧是基于模块的,这是可能的。
在处理应用程序时,我注意到我们正在使用FilterRegistrationBean初始化一个过滤器,并通过WebSecurityConfigurerAdapter的configure(HttpSecurity http)方法将另一个过滤器添加到链中。
有人可以让我知道这是否将被视为两个不同的链吗?如果是这样,如何检查链以过滤出细节?
我能否仅删除通过WebSecurityConfigurerAdapter的configure(HttpSecurity http)方法添加的过滤器,并使用内部专有SSO的过滤器(优先级最高)替换通过FilterRegistrationBean注册的现有过滤器?
答案 0 :(得分:0)
好的,所以我们可以完全按照您在我们的系统之一中的要求进行操作。我们在Spring Boot 1和Spring Boot 2中进行了这项工作。这些是要执行的步骤。
创建一个扩展AbstractPreAuthenticatedProcessingFilter
的bean。实施getPreAuthenticatedPrincipal
和getPreAuthenticatedCredentials
,以从您的SSO系统中提取经过身份验证的用户和可选凭据(例如证书)。为此过滤器bean创建一个FilterRegistrationBean
,否则,由于spring boot的组件扫描,它将最终出现在主过滤器链和安全过滤器链中。
创建一个实现AuthenticationUserDetailsService<PreAuthenticatedAuthenticationToken>
的用户详细信息(授权)服务bean。覆盖loadUserDetails
以获取经过身份验证的令牌,并使用它以GrantedAuthority
列表的形式添加权限。
在您的WebSecurityConfigurerAdapter
bean子类中,执行以下操作:
注入您的AbstractPreAuthenticatedProcessingFilter
子类和AuthenticationUserDetailsService
的子类。
添加类型为PreAuthenticatedAuthenticationProvider
的类成员,并使用new
(不是bean)对其进行初始化。
在configure(HttpSecurity)
中,使用身份验证管理器初始化您的过滤器bean:yourBean.setAuthenticationManager(authenticationManager())
,然后确保包含过滤器:
http.addFilter(yourBean)
.authorizeRequests()
.requestMatchers(...)
configure(AuthenticationManagerBuilder)
并初始化在步骤(2)中创建的PreAuthenticatedAuthenticationProvider
。 this.preAuthProvider.setPreAuthenticatedUserDetailsService(this.userDetailsService);
this.preAuthProvider.setThrowExceptionWhenTokenRejected(true);
authBuilder.authenticationProvider(this.preAuthProvider);
应该就这些了。希望有帮助。