在 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 MVC 的服务器上实现 WebSocket