Spring Security MultiHttpSecurity配置,以便我可以执行两种类型的认证。JWT令牌和会话Cookie。

IT小君   2023-09-16T19:54:04
AI系统维护升级中,请稍后再试!如有不便敬请谅解。
评论(1)
IT小君

我了解你的需求。

  1. 你需要暴露API,这些API需要通过请求头中的JWT令牌进行访问(每个请求都需要)。
  2. 同时,Web应用程序应该通过基于表单的身份验证机制进行保护,该机制应该基于HTTP会话工作。

你可以通过两个身份验证过滤器来实现这一点。

过滤器-1:用于Rest API(JwtAuthTokenFilter),它应该是无状态的,并且通过请求中发送的授权令牌进行标识。
过滤器-2:你还需要另一个过滤器(UsernamePasswordAuthenticationFilter)。默认情况下,如果你通过 http.formLogin() 进行配置,Spring Security会提供这个过滤器。在这里,每个请求都是通过会话(JSESSIONID cookie)进行标识的。如果请求不包含有效的会话,则会重定向到认证入口点(比如:登录页面)。

推荐的URL模式
api-url-pattern    = "/api/**" [严格用于 @order(1)]
webApp-url-pattern = "/**" [通配符 "/**" 始终用于更高的顺序,否则下一个顺序配置将变为无效配置]

实现方法

  • 定义具有@EnableWebSecurity注解的主配置类

  • 创建两个内部静态类,它们应该扩展WebSecurityConfigurerAdapter并使用@Configuration和@Order进行注解。这里,用于Rest API配置的顺序应该是1,而用于Web应用程序配置的顺序应该大于1

  • 参考我在这个链接中的答案中有更多详细解释,其中包含必要的代码。如果需要,可以随时要求提供github存储库中的可下载链接。

限制
这里两个过滤器将同时工作(并行)。也就是说,即使用户通过会话进行了身份验证,他也无法在没有JWT令牌的情况下访问API。

编辑
对于OP的要求,他不想定义任何角色,但允许已经通过身份验证的用户访问API。针对他的需求,修改以下配置。

http.csrf().disable()
.antMatcher("/web/umgmt/**").authorizeRequests()
.antMatcher("/web/umgmt/**").authenticated() // 使用这个
2023-09-16T19:54:32   回复