Spring Security 结合了 Container Security 和 JWT Token
Posted
技术标签:
【中文标题】Spring Security 结合了 Container Security 和 JWT Token【英文标题】:Spring Security combine Container Security and JWT Token 【发布时间】:2021-11-12 01:57:42 【问题描述】:是否可以有一个登录休息服务,通过 Spring Security 验证容器安全性,如果成功则返回 JWT 令牌。然后调用其他服务将使用 JWT 过滤器。
基本思路是这样的。
-
我有一个有登录页面的 React 应用程序。它发送带有用户名和密码的登录请求(通过休息服务)。安全性是基于容器的(例如 Tomcat 用户)。 Spring security 应该通过容器进行身份验证,如果用户名和密码都可以,那么登录服务会返回一个 JWT Token。
所有其他服务都使用 Spring Security JWT Token Filter 安全性。
我在谷歌上找不到这种情况的例子。
【问题讨论】:
【参考方案1】:您要查找的是 Spring Security 所称的 Pre-Authentication。
您可以针对不同的场景启用它,我将展示一个示例 Java EE 容器。
@Bean
SecurityFilterChain appSecurity(HttpSecurity http) throws Exception
http
...
.jee(Customizer.withDefaults())
...
return http.build();
jee()
将做的是在您的SecurityFilterChain
中注册一个J2eePreAuthenticatedProcessingFilter
,过滤器本身将从HttpServletRequest
中提取Principal
并调用PreAuthenticatedAuthenticationProvider
对其进行身份验证。
然后,在您的控制器中,您可以注入 Principal
并使用 Principal 的详细信息构建 JWT。
【讨论】:
谢谢,非常接近。仍然没有完全工作。这是我所拥有的:在我的 Springboot 应用程序属性中,我有 spring.security.user.name=testuser spring.security.user.password=testpwd 然后我通过 Insomnia,Basic Auth 发送请求。我从 J2eePreAuthenticatedProcessingFilter 进入调试器。标头的授权值为 Basic dGVzdHVzZXI6dGVzdHB3ZA== 但是它返回的主体为 null。 我不确定我是否理解你的问题。您是尝试使用自己的用户存储使用 HTTP Basic 进行身份验证,还是尝试使用基于 Servlet 的预身份验证? 我有一个 tomcat 服务器,目前使用 tomcat-users.xml。最终客户将在 Tomcat 设置中设置用户连接 (LDAP)。所以它是基于服务器的身份验证。我有一个发送用户名和密码的登录休息服务。据我了解, PreAuthenticatedAuthenticationProvider 将对服务器进行身份验证。第一个问题这是正确的理解吗?发生的情况是原则始终为空。也许问题是我如何在请求中发送用户名和密码。也许你可以给我一些指导。非常感谢! 您必须知道用户是如何访问应用程序的。查看参考指南和AbstractPreAuthenticatedProcessingFilter
实现。 docs.spring.io/spring-security/site/docs/current/reference/…以上是关于Spring Security 结合了 Container Security 和 JWT Token的主要内容,如果未能解决你的问题,请参考以下文章
基于RBAC的权限控制浅析(结合Spring Security)
Spring Security 结合 Spring 存储库来保护和验证网站的各个部分
使用 Spring Security 在一个应用程序中结合数据库和 SAML 身份验证