Spring Security OAuth专题学习-密码模式JWT实现

本文是Spring Security OAuth2学习系列文章中的第三篇;主要讲解密码模式下如何使用JWT管理Token。关于密码模式非JWT的实现示例及Spring Security OAuth2的一些基础知识,请移步本博客文章清单进行查看。1. JWT是什么JWT是JSON Web Token的缩写。它与标准Token不一样的地方在于,在Token中它附加存储了很多额外的信息,如Toke...
摘要由CSDN通过智能技术生成

本文是Spring Security OAuth2学习系列文章中的第三篇;主要讲解密码模式下如何使用JWT管理Token。

关于密码模式非JWT的实现示例及Spring Security OAuth2的一些基础知识,请移步本博客文章清单进行查看。

1. JWT是什么

JWT是JSON Web Token的缩写。它与标准Token不一样的地方在于,在Token中它附加存储了很多额外的信息,如Token的失效时间,Token所拥有的权限等。

在了解为什么要有JWT及什么时候使用JWT前,我们先来看下非JWT模式下资源服务器如何校验Token的有效性;

  • 资源服务器收到带Token的请求;
  • 资源服务器将Token发送到授权服务器/oauth/check_token接口
  • 授权服务器校验Token有效性,并将Token的权限信息(如有权访问的资源清单、对资源清单能够进行的操作等)返回给资源服务器;
  • 资源服务器根据返回的信息进行处理:
    • Token无效,返回相应错误信息给调用方;
    • Token有效,但无权限访问想要访问的资源,返回相应错误给调用方;
    • Token有效,且有权限访问想要访问的资源,访问资源后返回成功给调用方;

注意到这种模式下,每次有请求时,资源服务器都要进行这样一个处理,这大大增加了资源服务器、授权服务器负担及网络开销!

那么有没有一种方式能够减少这个校验请求的次数呢?这就是JWT要解决的问题。

它的原理就是在Token中附带了权限校验需要的信息;那么在资源服务器中进行权限验证的时候就不需要访问授权服务器获取Token所对应的权限信息了。

但这又引入了另外一个问题,如何保证Token本身是有效的而不是被伪造的?JWT通过加密的方式来保证Token的有效性,可以选择多种加密方式,其中非对称方式使用的比较多:授权服务器通过私钥加密Token;然后对外暴露公钥的获取接口;资源服务器获取公钥后使用其来对Token进行解密。由于公钥基本不会变化,因此请求到的公钥资源服务器就可以缓存到本地服务中。

通过这样一系列处理,JWT校验Token时不需要再每次都请求授权服务器进行校验,相当于将校验过程从授权服务器中下沉到了资源服务器中。

通过https://jwt.io/可以解析某个Token,直接看到其中所包含的信息,如token:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJhdWQiOlsidGVzdFJlc291cmNlIl0sInVzZXJfbmFtZSI6InRlc3QiLCJzY29wZSI6WyJyZWFkIiwid3JpdGUiXSwiZXhwIjoxNTUwODU3NjA4LCJhdXRob3JpdGllcyI6WyJST0xFX1VTRVIiXSwianRpIjoiYTg5MjdmNTItMDFlNi00NjFlLWJjNjEtOGNiZjYwODFjYmZlIiwiY2xpZW50X2lkIjoidGVzdCJ9.NXlLTSkLpajmYm6R66UYRQ81n6Z3J-wE4bTDf7sMqGU

解析到的信息为:

{
   
  "aud": [
    "testResource"
  ],
  "user_name": "test",
  "scope": [
    "read",
    "write"
  ],
  "exp": 1550857608,
  "authorities": [
    "ROLE_USER"
  ],
  "jti": "a8927f52-01e6-461e-bc61-8cbf6081cbfe",
  "client_id": "test"
}

如果想要向Token中增加更多自定义信息,可以通过TokenEnhancer接口实现。

2 实现

本节使用一个Spring Boot的示例来说明JWT的配置及使用。

2.1 MVN

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.security.oauth</groupId>
    <artifactId>spring-security-oauth2</artifactId>
    <version>2.3.4.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>2.1.2.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.security</groupId>
    <artifactId>spring-security-jwt</artifactId>
    <version>1.0.9.RELEASE</version>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-security</artifactId>
</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>

2.2 授权服务器

2.2.1 Security普通配置:

@Configuration
@EnableWebSecurity
public class SecurityConfigurer extends WebSecurityConfigurerAdapter {
   
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
   
        auth.inMemoryAuthentication().withUser("test").
  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 前后端分离是一种将前端界面与后端逻辑进行分离开发的架构方式,使得前端与后端可以并行开发。OAuth 2.0是一种授权框架,用于授权和认证流程的规范化,而Spring Security是一个在Java中实现安全控制的框架,提供了大量的安全特性。Spring Authorization Server是Spring Security中用于实现授权服务器的模块,它支持OAuth 2.0的各种授权模式密码模式OAuth 2.0中的一种授权模式,它允许用户通过提交用户名和密码来获取访问令牌,然后使用该令牌来访问受保护的资源。在前后端分离的架构中,可以使用Spring Security配合Spring Authorization Server来实现密码模式的认证和授权。 在密码模式下,前端首先需要收集用户的用户名和密码,并将其发送给后端。后端使用Spring Security提供的密码编码器对密码进行加密,并验证用户名和密码的正确性。如果验证通过,则后端向客户端颁发一个访问令牌,通常是一个JWT(JSON Web Token)。前端使用获得的访问令牌来访问需要受保护的资源,每次请求将该令牌作为Authorization头的Bearer字段发送给后端进行验证。后端可以使用Spring Security的资源服务器来验证该令牌的有效性,并根据用户的权限控制对资源的访问。 使用Spring SecuritySpring Authorization Server的密码模式可以实现安全的前后端分离架构。通过合理配置和使用安全特性,可以保障用户的身份认证和资源的授权,确保系统的安全性。 ### 回答2: 前后端分离是一种软件架构模式,前端和后端通过使用API进行通信,分别负责处理用户界面和数据逻辑。OAuth 2.0是一种用于授权的开放标准协议,它允许用户在第三方应用程序中授权访问其受保护的资源。Spring SecuritySpring框架中的一个模块,提供了身份验证和授权功能。 在前后端分离的架构中,前端应用程序通常需要使用OAuth 2.0协议进行用户授权,以访问后端应用程序的受保护资源。为了实现密码模式,我们可以使用Spring Security的模块之一,即spring-authorization-server。 spring-authorization-server是Spring Security的一个子模块,用于实现OAuth 2.0协议中的授权服务器。密码模式OAuth 2.0协议中的一种授权模式,允许前端应用程序通过用户的用户名和密码进行授权。密码模式在安全性上有一定的风险,因此在实际应用中需要谨慎使用使用spring-authorization-server的密码模式,我们可以在前端应用程序中收集用户的用户名和密码,并将其提交给后端应用程序进行验证。后端应用程序将使用Spring Security进行身份验证,并向前端应用程序颁发一个访问令牌,该令牌可以用于后续的API请求。 通过使用前后端分离、OAuth 2.0和spring-authorization-server的密码模式,我们可以实现安全的用户授权和身份验证机制,确保只有经过授权的用户才能访问受保护的资源。这种架构模式能够提高系统的安全性和可扩展性,适用于各种类型的应用程序。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值