如何在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.
}
特别声明:以上内容(图片及文字)均为互联网收集或者用户上传发布,本站仅提供信息存储服务!如有侵权或有涉及法律问题请联系我们。
举报