【问题标题】:Spring Security combine Container Security and JWT TokenSpring Security 结合了 Container Security 和 JWT Token
【发布时间】:2021-11-12 01:57:42
【问题描述】:

是否可以有一个登录休息服务,通过 Spring Security 验证容器安全性,如果成功则返回 JWT 令牌。然后调用其他服务将使用 JWT 过滤器。

基本思路是这样的。

  1. 我有一个有登录页面的 React 应用程序。它发送带有用户名和密码的登录请求(通过休息服务)。安全性是基于容器的(例如 Tomcat 用户)。 Spring security 应该通过容器进行身份验证,如果用户名和密码都可以,那么登录服务会返回一个 JWT Token。
  2. 所有其他服务都使用 Spring Security JWT Token Filter 安全性。

我在谷歌上找不到这种情况的例子。

【问题讨论】:

    标签: spring-security jwt


    【解决方案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/…
    猜你喜欢
    • 2016-09-22
    • 2016-09-10
    • 2019-05-12
    • 2016-03-22
    • 2018-01-29
    • 2014-07-04
    • 2020-10-17
    • 2018-12-08
    • 2017-09-09
    相关资源
    最近更新 更多