SpringBoot整合SpringSecurit(二)通过token进行访问

在文章:SpringBoot整合SpringSecurit(一)实现ajax的登录、退出、权限校验-优快云博客

里面,使用的session的方式进行保存用户信息的,这一篇文章就是使用token的方式。

在其上进行的改造,可以先看SpringBoot整合SpringSecurit(一)实现ajax的登录、退出、权限校验-优快云博客,再看这个就比较好了。

1、新建过滤器,将通过token查询到的用户信息存入到security中

package com.example.springboot.security.demo.filter;

import com.example.springboot.security.demo.controller.LoginController;
import lombok.extern.slf4j.Slf4j;
import org.springfra
虽然给定引用中未直接提及Spring Boot 3.4整合Spring Security和JWT Token实现权限认证的教程,但可以基于相关引用的通用思路来构建此教程。 ### 准备工作 - **引入依赖**:在`pom.xml`文件中添加Spring Boot、Spring Security和JJWT等相关依赖。示例如下: ```xml <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-security</artifactId> </dependency> <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> </dependencies> ``` ### 设计表结构 设计用户相关的数据库表,例如用户表包含用户名、密码、角色等字段,用于存储用户信息和权限信息。 ### 生成基本代码 - **JWT的生成和解析工具类**:创建一个工具类用于生成和解析JWT Token。示例代码如下: ```java import io.jsonwebtoken.Jwts; import io.jsonwebtoken.SignatureAlgorithm; import java.util.Date; public class JwtUtils { private static final String SECRET_KEY = "yourSecretKey"; private static final long EXPIRATION_TIME = 86400000; // 24小时 public static String generateToken(String username) { return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME)) .signWith(SignatureAlgorithm.HS512, SECRET_KEY) .compact(); } public static String getUsernameFromToken(String token) { return Jwts.parser() .setSigningKey(SECRET_KEY) .parseClaimsJws(token) .getBody() .getSubject(); } } ``` - **Spring Security配置**:配置Spring Security,包括白名单、登录验证、JWT过滤器等。示例代码如下: ```java import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; import org.springframework.security.web.SecurityFilterChain; import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter; @Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .csrf().disable() .authorizeRequests() .antMatchers("/login").permitAll() .anyRequest().authenticated() .and() .addFilterBefore(new JwtFilter(), UsernamePasswordAuthenticationFilter.class); return http.build(); } } ``` - **JWT过滤器**:创建一个过滤器用于验证请求中的JWT Token。示例代码如下: ```java import javax.servlet.FilterChain; import javax.servlet.ServletException; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.web.filter.OncePerRequestFilter; import java.io.IOException; public class JwtFilter extends OncePerRequestFilter { private final UserDetailsService userDetailsService; public JwtFilter(UserDetailsService userDetailsService) { this.userDetailsService = userDetailsService; } @Override protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String token = request.getHeader("Authorization"); if (token != null && token.startsWith("Bearer ")) { token = token.substring(7); String username = JwtUtils.getUsernameFromToken(token); UserDetails userDetails = userDetailsService.loadUserByUsername(username); UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken( userDetails, null, userDetails.getAuthorities()); SecurityContextHolder.getContext().setAuthentication(authentication); } filterChain.doFilter(request, response); } } ``` ### 登录验证 - **登录接口**:创建一个登录接口,用于用户登录并生成JWT Token。示例代码如下: ```java import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; @RestController public class LoginController { @PostMapping("/login") public String login(@RequestParam String username, @RequestParam String password) { // 验证用户名和密码 if ("admin".equals(username) && "password".equals(password)) { return JwtUtils.generateToken(username); } return "Login failed"; } } ``` ### 启动查看接口 启动Spring Boot应用程序,测试登录接口和需要权限认证的接口。未登录时访问需要权限的接口会被拦截,登录后携带有效的JWT Token可以正常访问。 ### 总结 通过以上步骤,实现了Spring Boot 3.4整合Spring Security和JWT Token实现权限认证。利用Spring Security的强大功能进行权限管理,结合JWT的无状态特性实现Token验证。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值