返回

如何在Spring Security中为UI和REST端点使用不同的会话创建策略?

发布时间:2022-02-25 19:57:56 310
# 后端

我有一个包含UI和一些REST端点的应用程序。UI使用SAML登录(旧的Spring安全SAML扩展),其余端点使用自定义身份验证。REST端点仅由外部应用程序调用。对于其余端点(“api/**”)我已经说明了一个无状态会话创建策略,对于端点的其余部分,根本没有会话创建策略(我还尝试了ALWAYS,如下例所示)。

在一些Spring Boot版本之前,不确定哪个版本有效。目前我使用的是Spring Boot v.2.6.1。UI端点从Http会话获取了身份验证对象。

但现在它不起作用了。在使用默认HttpSessionSecurityContextRepository实现的Http会话中找不到安全上下文对象。它已保存,但无法恢复。

那么,是否可以使用两个会话创建策略,一个用于其余部分,另一个用于UI部分,还是应该以不同的方式处理?现在,用户界面似乎也在使用无状态会话创建策略,这是无意的。我使用了两个WebSecurity配置适配器类;一个用于API,另一个用于UI。成功登录SAML后,重定向URL现在包含;;jsessionid=6051854D94A0771BB9B99FE573AA4DFD“;参数可能是因为无国籍政策。。。?

    protected void configure(HttpSecurity http) throws Exception {

        List authFilters = new ArrayList<>();
        authFilters.add(new OAuthMacAuthenticationProcessingFilter(authenticationManager(), this.properties));

        ApiAuthenticationProcessingFilter apiAuthenticationProcessingFilter = new ApiAuthenticationProcessingFilter(authenticationManager(),authFilters);

        http
        .csrf()
        .disable()
        .antMatcher("/api/**")
        .authorizeRequests()
        .anyRequest()
        .authenticated()
        .and()
        .exceptionHandling()
        .authenticationEntryPoint((req, rsp, e) -> rsp.sendError(HttpServletResponse.SC_UNAUTHORIZED))
        .and()
        .addFilterBefore(apiAuthenticationProcessingFilter, BasicAuthenticationFilter.class)
        .sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

至于用户界面部分

    protected void configure(HttpSecurity http) throws Exception {

        http.securityContext().securityContextRepository(customSessionSecurityContextRepository);

        http
        .httpBasic()
        .authenticationEntryPoint(samlEntryPoint());

        http
        .addFilterBefore(metadataGeneratorFilter(), ChannelProcessingFilter.class);

        var auth = http
                .authorizeRequests()
                .antMatchers("/saml/**").permitAll()
                .antMatchers("/loggedout/**").permitAll()
                .antMatchers("/error").permitAll();
                
        auth
        .anyRequest()
        .authenticated();

        http.csrf().disable();

        http.sessionManagement()
        .sessionCreationPolicy(SessionCreationPolicy.ALWAYS);

        http.headers().frameOptions().sameOrigin();

        http.exceptionHandling().accessDeniedHandler(this.accessDeniedHandler());

        http
        .logout()
        .disable();    // The logout procedure is already handled by SAML filters.
    }
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报
评论区(0)
按点赞数排序
用户头像
相关帖子