当前位置: 首页 > 知识库问答 >
问题:

使用Spring Security Saml和SP应用程序的无状态会话

盖晋
2023-03-14

我试图运行启动示例Spring安全saml引导从,https://github.com/vdenotaris/spring-boot-security-saml-sample

我能够运行它并与身份提供者集成。

但是,我看到每次都创建一个会话,并且在用户退出之前保持持久。

我在spring boot中使用基于资源的服务,因此不想增加会话的开销。

我尝试将以下行添加配置方法中,http.sessionManagement()。

但是,有了这个设置,我总是被要求登录到身份提供商。

如果我登录,它会返回页面,要求我在循环中再次登录。

我不确定禁用会话时这是否是正确的行为。

有谁能为我提供一种正确的方法来使用spring security saml扩展和服务提供商应用程序的无状态会话吗。

谢谢

斯里兰卡

共有2个答案

丌官哲彦
2023-03-14

要在无状态下启用SAML,您需要:

  • 将SamlMessageFactory设置为空
  • 确保SAML过滤器位于“记住我”过滤器之后
  • 实际上,要像往常一样启用无状态并配置“记住我”服务

请注意,这样做意味着您没有JSESSIONID,这意味着spring将不再记录原始请求的URL,因此无法处理稍后将您重定向回该URL的问题。(建议稍后对此进行解决)。

@Configuration
@EnableWebSecurity
public class YourSecurityConfig extends WebSecurityConfigurerAdapter {
    
    /**
     * Since SAML is being used under a stateless mode, we can not use the default
     * Message Storage factory as it uses http sessions. Instead we have to use
     * the EmptyStorageFactory().
     * 
     */
    @Bean
    public SAMLMessageStorageFactory sAMLMessageStorageFactory() {
        return new EmptyStorageFactory();
    }

    
@Autowired(required=false)
    @Qualifier("samlFilter")
    FilterChainProxy samlFilter;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
       ...
       // Only try to do SAML stuff after we have tried to authenticate the user.
       http.addFilterAfter(samlFilter, RememberMeAuthenticationFilter.class)
       
       // (Optional part if you want redirects)
       // Just before we get to the samlFilter if we have not yet authenticated we
       // may set a cookie storing the location to which we should redirect back to
       // when all is said and done.
       http.addFilterBefore(setRedirectCookieForPostSAMLAction, samlFilter.getClass());
       // On SAML auth success, apply the redirect from the cookie. 
       sAMLProcessingFilter.setAuthenticationSuccessHandler(new ReadRedirectCookieForSAMLSuccessHandler());
       // (End Optional part)
       ...
       // Don't forget to enable your token based remember me service
       // Also don't forget to set stateless
       http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }
}

最后,如果您确实想要支持某种形式的重定向,请执行以下操作:

  • 让你的用户界面将你重定向到某个特殊的URL,并在GET参数中记录要转到的URL。例如,如果你在/secure出现。html,用户界面会将您重定向到/saml redirect。html?重定向到=/secure。html

public class setRedirectCookieForPostSAMLAction implements Filter {
   void setRedirectCookieIfRequired(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
        // If the user is not authenticated and is going to the saml redirect page
        if(authentication == null && 
            new AntPathRequestMatcher("/saml-redirect.html", null).matches(request)) {
            if(request has a redirectTo param) {
                 Set cookie "saml-redirect-post-action" to Base64(redirectTo);
            }
        }

}
}
  • 创建一个成功处理程序ReadReDirectCookieForSAML成功处理程序,当用户成功使用SSO登录时(如上配置),该成功处理程序将运行。如果重定向cookie,该成功处理程序只需要重定向用户。它还应该清除该cookie重定向cookie。

(别忘了检查重定向是否合法,并且在重定向用户之前只会转到你的应用。)

单于帅
2023-03-14

对于SAML身份验证部分,您肯定需要一个会话,因此您有两个选项:

1)在您的应用程序中有两个不同的安全上下文,一个用于SAML身份验证,一个用于无状态服务。不知道如何验证您的服务,但它必须有某种令牌身份验证才能是无状态的。您可以定义2WebSecurityConfigrerAdapter并覆盖配置(HttpSecurity超文本传输协议)方法。然后在saml配置中使用http.requestMatcher("/saml/**")http.requestMatcher("/service/**")在您的服务配置中,/saml下的所有内容都将通过samlauth和/service下的所有内容都将通过您所拥有的任何内容。

2) 在SAML配置中添加更多过滤器(在SAML过滤器之前),使其与不同类型的身份验证(例如基于令牌的身份验证)一起工作,并且只要此过滤器能够在SAML过滤器之前生成有效的身份验证,您就应该是好的。

您还可以查看此库:https://github.com/ulisesbocchio/spring-boot-security-saml简化SAML配置

 类似资料:
  • 我正在用Spring Web、Spring Security和Spring social创建一个Spring启动应用程序。该应用程序包含利用基本身份验证实现安全的rest服务。我试图将Spring配置为使应用程序无状态,但是当我使用浏览器向web服务发出请求时,浏览器会提示输入用户凭据,但由于会话创建,所有之前的请求都使用相同的用户凭据。我已将应用程序配置为阻止这种情况发生,但仍然存在问题\ 我应

  • For example, here’s how you would select the object: And to fetch the counter’s currentValue, we can pass in a string array, where each string plucks a single property from the application state one a

  • 对于有状态会话bean(SFSB)和无状态会话bean(SLSB)的用法,我有点困惑。 我知道SFSB与客户保持状态。这很有帮助:什么时候使用有状态会话bean而不是无状态会话bean? 这里和许多其他地方提供的示例是SFSB的购物车。 “如果一个任务需要一系列方法调用(不止一次),并且您需要保留以前的结果以在下一次调用中使用它们,那么就可以使用SFSB”--Source。这将更像是签出(页面之间

  • 问题内容: 有状态会话Bean定义如下: 有状态会话Bean对象的状态由其实例变量的值组成。在有状态会话Bean中,实例变量代表唯一的客户端Bean会话的状态。因为客户端与其bean进行交互(“交谈”),所以这种状态通常称为对话状态。 无状态会话Bean定义如下: 无状态会话Bean无状态会话Bean不会与客户端保持对话状态。当客户端调用无状态Bean的方法时,该Bean的实例变量可能包含特定于该

  • 我有一个带有JWT auth的Spring boot应用程序,非常好用!但我用无状态策略禁用了csrf: 这个Rest应用编程接口是为SPA反应应用程序设计的。我读到当我使用JWT令牌时,我不需要设置csrf令牌。JWT是否像csrf保护一样工作?我认为这不是csrf保护。

  • 问题内容: 我希望更改为在我的Web应用程序中实现无状态Spring Security的目的是结束,但事实并非如此。 进行了此更改后,由于(根据我的假设)Spring安全性在会话中不存储任何内容,并且无法对安全的Web请求进行身份验证,因此Spring安全性似乎无法正常工作。 我如何利用此无状态功能? 我似乎尚未找到任何有关如何为无状态Web应用程序实现无状态Spring安全的示例。 谢谢 ! 问