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 与 JPA 结合使用

Spring Security 结合 Spring 存储库来保护和验证网站的各个部分

使用 Spring Security 在一个应用程序中结合数据库和 SAML 身份验证

spring security动态管理资源结合自定义登录页面

Spring boot +Spring Security + Thymeleaf 认证失败返回错误信息