【问题标题】:Spring SAML Security Integration with Spring Web applicationSpring SAML 与 Spring Web 应用程序的安全集成
【发布时间】:2018-05-17 00:24:22
【问题描述】:

我已经使用 spring-security-saml 2.0 集成了我们的 web 应用程序。 集成工作正常我可以从 IDP 获得成功身份验证消息,但是当我被重定向到我的 Web 应用程序页面时。应用程序创建自己的 SecurityContextHolder 并且我将用户作为匿名身份验证对象不是由 SAMLAuthenticationProvider 创建的 SAMLAuthentication。

需要知道我们在获得认证成功或错误后如何集成现有 Web 应用程序的 Spring Security 吗?。

【问题讨论】:

    标签: spring spring-security single-sign-on saml-2.0 spring-saml


    【解决方案1】:

    SAMLAuthenticationProvider 验证传入的 SAML 响应,并返回一个 ExpiringUsernameAuthenticationToken 对象,该对象是在传入 SAML 断言的帮助下填充的(例如,带有声明的 UserDetails 和带有 SAML 令牌到期时间的令牌到期时间)。在此之后,Spring 安全性为它接收到的每个请求引用此令牌以获取用户信息。

    要将 Spring SAML 与您现有的 Spring 安全应用程序集成,您可能需要自定义实现 user-context-mapper,它可以将传入 SAML 响应中的权限映射到您的本地权限(组)。

    希望这会有所帮助。

    【讨论】:

      【解决方案2】:

      在 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;
      }
      

      【讨论】:

        猜你喜欢
        • 2021-05-04
        • 2016-12-03
        • 1970-01-01
        • 2021-11-19
        • 2018-10-31
        • 2015-01-23
        • 1970-01-01
        • 2023-03-26
        • 2011-10-16
        相关资源
        最近更新 更多