springboot jwt单点登录
时间: 2023-08-28 13:17:12 浏览: 120
springsecurity+oauth2+jwt实现单点登录demo
5星 · 资源好评率100%
在Spring Boot中使用JWT(JSON Web Token)实现单点登录可以按照以下步骤进行:
1. 添加依赖:在`pom.xml`文件中添加JWT依赖:
```xml
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
```
2. 创建JWT工具类:创建一个JWT工具类来生成、解析和验证JWT。
```java
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import org.springframework.stereotype.Component;
import java.util.Date;
@Component
public class JwtUtils {
private final String secret = "yourSecretKey";
private final long expiration = 86400000; // Token有效期为24小时
public String generateToken(String username) {
Date now = new Date();
Date expiryDate = new Date(now.getTime() + expiration);
return Jwts.builder()
.setSubject(username)
.setIssuedAt(now)
.setExpiration(expiryDate)
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
public String getUsernameFromToken(String token) {
Claims claims = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
return claims.getSubject();
}
public boolean validateToken(String token, String username) {
String tokenUsername = getUsernameFromToken(token);
return (tokenUsername.equals(username) && !isTokenExpired(token));
}
private boolean isTokenExpired(String token) {
Date expirationDate = Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody()
.getExpiration();
return expirationDate.before(new Date());
}
}
```
3. 创建登录和验证接口:创建登录和验证接口来处理用户的登录和验证请求。
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class AuthController {
@Autowired
private JwtUtils jwtUtils;
@PostMapping("/login")
public ResponseEntity<?> login(@RequestBody User user) {
// 通过验证用户的用户名和密码
// 生成JWT
String token = jwtUtils.generateToken(user.getUsername());
return ResponseEntity.ok(new AuthResponse(token));
}
@PostMapping("/validate")
public ResponseEntity<?> validate(@RequestBody TokenRequest tokenRequest) {
String token = tokenRequest.getToken();
String username = tokenRequest.getUsername();
boolean isValid = jwtUtils.validateToken(token, username);
return ResponseEntity.ok(new ValidateResponse(isValid));
}
}
```
在上述代码中,`login`接口用于验证用户的用户名和密码,并生成JWT。`validate`接口用于验证JWT的有效性。
注意:在实际应用中,你可能需要结合数据库来验证用户的用户名和密码。
4. 创建请求拦截器:创建一个请求拦截器来验证每个请求中的JWT。
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@Component
public class JwtInterceptor implements HandlerInterceptor {
@Autowired
private JwtUtils jwtUtils;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader("Authorization");
if (token != null && token.startsWith("Bearer ")) {
token = token.substring(7);
String username = jwtUtils.getUsernameFromToken(token);
if (username != null && jwtUtils.validateToken(token, username)) {
// 验证通过,将用户信息存储在请求的属性中
request.setAttribute("username", username);
return true;
}
}
// 验证失败,返回未授权状态
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
}
```
在上述代码中,我们从请求的头部获取JWT,并验证其有效性。如果验证通过,则将用户信息存储在请求的属性中,供后续处理使用。
5. 配置拦截器:在Spring Boot的配置类中配置拦截器。
```java
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Autowired
private JwtInterceptor jwtInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login"); // 不拦截登录接口
}
}
```
在上述代码中,我们将`JwtInterceptor`添加到拦截器列表中,并排除了登录接口,以免拦截登录请求。
以上是使用JWT实现单点登录的基本步骤。你可以根据自己的需求进行相应的调整和扩展。
阅读全文