写一个spinboot通过token登录
时间: 2024-03-27 13:36:31 浏览: 16
好的,我可以为您解答。首先,需要明确一下,SpinBoot 是一个基于 Spring Boot 的开发框架,因此我们可以使用 Spring Security 框架来实现通过 Token 登录的功能。
下面是实现步骤:
1. 在 Spring Boot 项目中引入 Spring Security 和 JWT 相关依赖。
2. 创建一个 JWT 工具类,用于生成 Token 和解析 Token。
3. 创建一个 TokenFilter 类,用于拦截请求,并验证 Token 是否有效。
4. 在 Spring Security 配置类中,配置 TokenFilter 的过滤规则,并设置登录接口不需要 Token 验证。
5. 创建一个登录接口,接收用户的用户名和密码,验证成功后,生成 Token 并返回给客户端。
6. 客户端在每次请求时,将 Token 放在请求头中,TokenFilter 拦截请求并验证 Token 是否有效。
下面是一个简单的代码实现示例:
1. 引入依赖
```
<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>
```
2. JWT 工具类
```
public class JwtUtils {
private static final String SECRET_KEY = "your_secret_key";
private static final long EXPIRATION_TIME = 86400000; // 24 hours
public static String generateToken(String username) {
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + EXPIRATION_TIME))
.signWith(SignatureAlgorithm.HS512, SECRET_KEY.getBytes())
.compact();
}
public static String getUsernameFromToken(String token) {
return Jwts.parser().setSigningKey(SECRET_KEY.getBytes()).parseClaimsJws(token).getBody().getSubject();
}
public static boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(SECRET_KEY.getBytes()).parseClaimsJws(token);
return true;
} catch (SignatureException ex) {
// invalid signature
} catch (ExpiredJwtException ex) {
// token expired
} catch (Exception ex) {
// other exceptions
}
return false;
}
}
```
3. TokenFilter 类
```
public class TokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
String token = request.getHeader("Authorization");
if (StringUtils.isNotBlank(token) && token.startsWith("Bearer ")) {
token = token.substring(7);
if (JwtUtils.validateToken(token)) {
String username = JwtUtils.getUsernameFromToken(token);
UsernamePasswordAuthenticationToken authenticationToken = new UsernamePasswordAuthenticationToken(username, null, Collections.emptyList());
SecurityContextHolder.getContext().setAuthentication(authenticationToken);
}
}
filterChain.doFilter(request, response);
}
}
```
4. Spring Security 配置类
```
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private TokenFilter tokenFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated()
.and().addFilterBefore(tokenFilter, UsernamePasswordAuthenticationFilter.class);
}
}
```
5. 登录接口
```
@RestController
public class AuthController {
@PostMapping("/login")
public String login(@RequestParam("username") String username, @RequestParam("password") String password) {
// validate username and password
if (StringUtils.equals(username, "admin") && StringUtils.equals(password, "admin123")) {
String token = JwtUtils.generateToken(username);
return token;
} else {
throw new RuntimeException("Invalid username or password.");
}
}
}
```
这样,我们就实现了通过 Token 登录的功能。在客户端访问其他接口时,只需要将 Token 放在请求头中即可。