在 Spring Boot 2 上实现基于过滤器的 JWT 身份验证与 OAuth2 JWT 身份验证

Posted

技术标签:

【中文标题】在 Spring Boot 2 上实现基于过滤器的 JWT 身份验证与 OAuth2 JWT 身份验证【英文标题】:Implementing filter-based JWT authentication vs OAuth2 JWT authentication on Spring Boot 2 【发布时间】:2018-11-29 16:41:49 【问题描述】:

据我所知,OAuth2 框架需要一个自定义 JWT 身份验证服务器,我必须为基于过滤器的 JWT 实现创建一个带有 JWT 实用程序类的自定义安全过滤器。

但是我的问题是,在 Spring Boot 2 上实现 JWT 的最佳方法是什么?基于过滤器的身份验证还是 OAuth2?

根据客户端和应用程序的性质,有什么优缺点吗?

举个例子;如果应用程序管理不同的客户端(例如移动、Web、Web 服务等),OAuth2 身份验证是否提供任何优势?

注意:我的问题与 Spring-Boot REST API + Web 应用程序的安全性有关。

【问题讨论】:

【参考方案1】:

我找到了关于同一问题的讨论,我正在提取以下要点。

从技术的角度来看,我仍然不清楚具体的实现方式、时间和地点,但这有助于我做出决定。

    当我只需要 JWT 身份验证时,我个人犹豫是否引入 OAuth。感觉很混乱,老实说,我不希望使用 @EnableResourceServer 等增加额外的复杂性。也许这只是几行配置,但如果感觉有点矫枉过正。

    谁能告诉我为什么使用 JWT 令牌设置 OAuth2 提供程序如此困难?如果你想要 JWT 令牌,所有代码都已经在这里了。为什么使用它就这么难?

    答案:

    也许这并不难,但 1) 这样做感觉不自然,2) 这样做会更容易。 而不是使用@EnableResourceServer 和其他设置,我想要更简单的东西,比如:

    @Override
            protected void configure(HttpSecurity http) throws Exception 
        http
            .jwt()
                .loginUrl(new AntPathRequestMatcher("/api/login", "POST"))
                .secret("my-super-duper-secret")
                .claimsProvider(new MyClaimsProvider)
    

    您通常希望为 JWT 设置的内容是登录 url(可以默认为 /login)、密码和可选的一些 claimProvider 实现。应提供开箱即用的默认实现,将用户名和角色添加到声明中。 这样在 Spring Security 中设置 JWT 将非常容易。

    1234563如果您开始担心这种问题(您应该担心),那么您最终会实现一些非常接近 OAuth2 的东西,此时您可能会说“我们为什么不首先使用 OAuth2?”你明白我的意思吗?

    这个问题中描述的用例在概念上与 OAuth2 用例不是不同吗?在这里,我们将密码作为输入,将 JWT 令牌作为输出,然后使用 JWT 令牌访问资源。 OAuth 2 规范的 JWT 配置文件指定了一种不同的情况,其中 JWT 令牌是令牌服务的输入,访问令牌是输出,然后访问令牌用于访问资源。

    最好只使用简单的 JWT 令牌基础身份验证而不使用 OAuth,这对于小型项目来说有时会很复杂。

https://github.com/spring-projects/spring-security-oauth/issues/368

【讨论】:

以上是关于在 Spring Boot 2 上实现基于过滤器的 JWT 身份验证与 OAuth2 JWT 身份验证的主要内容,如果未能解决你的问题,请参考以下文章

未调用 Spring Boot Rest API 过滤器

在基于 Spring MVC 的服务器上实现 WebSocket

Spring MVC 以及 Spring Boot

如何使用新的 Spring Authorization Server 在资源服务器上实现基于角色的授权

spring boot与spring mvc的区别

spring boot与spring mvc的区别是什么?