SpringBoot之JWT令牌校验

SpringBoot之JWT令牌校验

本文根据黑马b站springboot3+vue3课程

封面

JWT

(JSON Web Token)是一种开放标准(RFC 7519),用于在不同实体之间安全地传输信息。它由三个部分组成:头部(Header)、载荷(Payload)和签名(Signature)。

  1. 头部(Header):头部通常由两部分组成,标识token的类型和所使用的签名算法,例如:
{
   
   
  "alg": "HS256",
  "typ": "JWT"
}

这表示该JWT使用HS256算法进行签名,并且是一个JWT类型的token。

  1. 载荷(Payload):载荷是JWT的第二部分,也称为Claim。它包含了要传输的数据,可以是用户的身份信息、权限信息等。载荷分为三个部分:

    • 注册声明(Registered Claims):这些是预定义的声明,包含了一些标准的信息,如iss(签发者)、sub(主题)、aud(接收者)、exp(过期时间)、nbf(生效时间)、iat(签发时间)等。
    • 公共声明(Public Claims):这些是自定义的声明,用于传递一些非强制性的信息,例如用户的角色、权限等。
    • 私有声明(Private Claims):这些也是自定义的声明,用于在JWT的发送和接收方之间共享信息,但它们不是JWT规范的一部分,只是双方之间协商的私有信息。
  2. 签名(Signature):签名是JWT的第三部分,用于验证消息的完整性和来源。它由使用私钥对头部和载荷进行签名的结果组成,以确保数据在传输过程中没有被篡改。

JWT通常用于身份验证和信息交换。例如,在 Web 应用程序中,当用户成功登录后,服务器会生成一个JWT并将其发送回客户端,客户端将JWT存储起来,并在后续的请求中将其发送给服务器进行身份验证。服务器收到JWT后,会验证其签名和有效期,并根据载荷中的信息来决定是否授权用户访问特定的资源。
在这里插入图片描述
在这里插入图片描述
依赖

在这里插入图片描述
如果输入正确的账号密码在本机访问如下
在这里插入图片描述

public class JwtTest {
   
   
    @Test

    public void testGen() {
   
   
        Map<String, Object> claims = new HashMap<>();
        claims.put("id", 1
### 实现Spring Boot中的JWT令牌登录 在构建基于Spring Boot的应用程序时,为了增强安全性并管理用户会话,可以采用JSON Web Token (JWT)认证机制[^1]。 对于配置安全设置而言,在创建自定义的`CustomUserDetailsService` bean之后,还需要确保密码编码器已正确定义以便处理用户的凭证验证过程。如果未指定`AuthenticationManagerBuilder`以及`AuthenticationProviderBean`的话,则默认情况下系统将会应用相应的自动配置逻辑来完成这些组件的初始化工作[^2]。 一旦身份验证请求成功通过审核流程后,框架内部调用了成功的回调函数——即`successfulAuthentication()`方法,并传递必要的参数给开发者用于进一步的操作控制或是记录日志等用途[^3]。 下面是一个简单的实现案例: #### 添加依赖项到pom.xml文件中 ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-api</artifactId> <version>${jwt.version}</version> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt-impl</artifactId> <scope>runtime</scope> <version>${jwt.version}</version> </dependency> <!-- 更多依赖... --> ``` #### 创建JwtTokenUtil工具类 此工具负责生成token字符串、解析payload信息等功能。 ```java public class JwtTokenUtil { private static final String SECRET_KEY = "your_secret_key"; public String generateAccessToken(UserDetails userDetails){ Map<String,Object> claims=new HashMap<>(); return Jwts.builder() .setClaims(claims) .setSubject(userDetails.getUsername()) .signWith(SignatureAlgorithm.HS512,SECRET_KEY.getBytes()) .compact(); } } ``` #### 定制化UserDetailService服务接口的具体实现形式 此类主要用于加载特定于应用程序的数据模型对象实例。 ```java @Service public class CustomUserDetailsService implements UserDetailsService { @Autowired private UserRepository userRepository; @Override public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException{ AppUser appUser=userRepository.findByUsername(username); if(appUser==null){ throw new UsernameNotFoundException("User not found"); } List<GrantedAuthority> authorities=appUser.getRoles().stream(). map(role->new SimpleGrantedAuthority(role.getName())).collect(Collectors.toList()); return new org.springframework.security.core.userdetails.User( appUser.getUsername(), appUser.getPassword(),authorities); } } ``` #### 配置SecurityConfig类以启用HTTP基本认证模式下的JWT过滤器链路 在此处注册了一个名为`authTokenFilter`的安全过滤器用来拦截所有进入系统的API请求并对其中携带的身份证明材料进行有效性校验。 ```java @Configuration @EnableWebSecurity public class SecurityConfig extends WebSecurityConfigurerAdapter { @Autowired private AuthEntryPointJwt unauthorizedHandler; @Bean public AuthTokenFilter authTokenFilter(){ return new AuthTokenFilter(); } @Override protected void configure(HttpSecurity http) throws Exception { http.cors().and().csrf().disable(). authorizeRequests().antMatchers("/api/auth/**").permitAll(). anyRequest().authenticated(). and(). exceptionHandling().authenticationEntryPoint(unauthorizedHandler).and(). sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS); http.addFilterBefore(authTokenFilter(), UsernamePasswordAuthenticationFilter.class); } } ```
评论 60
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

聪-coding

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值