在 SAML 处理程序的配置中,您需要设置 AuthenticationProvider。这就是将SAMLAuthentication 转换为您实施的用户详细信息的原因。
@Configuration
public class WebSecuritySamlConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(final AuthenticationManagerBuilder auth) {
auth
.authenticationProvider(samlAuthenticationProvider());
}
@Bean
public SAMLAuthenticationProvider samlAuthenticationProvider() {
final SAMLAuthenticationProvider samlAuthenticationProvider = new SAMLAuthenticationProvider();
samlAuthenticationProvider.setUserDetails (new MySamlUserDetailsService());
samlAuthenticationProvider.setForcePrincipalAsString (false);
return samlAuthenticationProvider;
}
}
在提供程序中设置的用户详细信息服务可以做任何您需要的事情,以便为SAMLCredential 代表的用户获取UserDetails。非常重要:此函数返回的对象必须包含 getAuthorities 方法的正确实现,以便 Spring 安全性的其余部分工作。最好只在返回的对象上实现UserDetails 接口,以确保您正确实现它。如果您不包含此实现,您可能会注意到所有页面都返回拒绝访问页面,因为没有设置权限。
public class MySamlUserDetailsService implements SAMLUserDetailsService {
@Override
public Object loadUserBySAML(final SAMLCredential samlCredential) throws UsernameNotFoundException {
final String username = samlCredential.getAttributeAsString("UserID");
final UserDetails userDetails = myUserDetailsService.getUserData(username);
return userDetails;
}
}
添加后,Spring 安全功能应该与此进程创建的UserDetails 一样正常运行。这是 Spring 文档中的 documentation on the SAMLAuthenticationProvider,其中说明了所有这些信息以及更多信息。
我的 SAML 成功处理程序也使用非 SAML 登录使用的相同成功处理程序。这可确保在确定 UserDetails 后两种类型的登录都遵循相同的路径。下面的代码也放在上面的WebSecuritySamlConfig中:
@Bean
public SAMLProcessingFilter samlWebSSOProcessingFilter() throws Exception {
final SAMLProcessingFilter samlWebSSOProcessingFilter = new SAMLProcessingFilter();
samlWebSSOProcessingFilter.setAuthenticationManager (authenticationManager());
samlWebSSOProcessingFilter.setAuthenticationSuccessHandler (authenticationSuccessHandler);
samlWebSSOProcessingFilter.setAuthenticationFailureHandler (failureRedirectHandler());
return samlWebSSOProcessingFilter;
}
@Bean
public SAMLWebSSOHoKProcessingFilter samlWebSSOHoKProcessingFilter() throws Exception {
final SAMLWebSSOHoKProcessingFilter filter = new SAMLWebSSOHoKProcessingFilter();
filter.setAuthenticationManager (authenticationManager());
filter.setAuthenticationSuccessHandler (authenticationSuccessHandler);
filter.setAuthenticationFailureHandler (failureRedirectHandler());
return filter;
}