以下是一个不使用Spring Security登录的解决方法的示例代码:
@RestController
public class AuthController {
@PostMapping("/login")
public ResponseEntity login(@RequestBody LoginRequest loginRequest) {
// 进行用户认证逻辑,例如检查用户名和密码是否匹配
if (authenticateUser(loginRequest.getUsername(), loginRequest.getPassword())) {
// 生成JWT令牌
String token = generateToken(loginRequest.getUsername());
return ResponseEntity.ok(token);
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).build();
}
}
private boolean authenticateUser(String username, String password) {
// 用户认证逻辑,例如从数据库中查询用户信息并验证密码
// 返回true表示认证通过,否则返回false
// 这里只是一个示例,实际项目中需要根据具体的认证需求来实现
return "admin".equals(username) && "password".equals(password);
}
private String generateToken(String username) {
// 使用JWT库生成JWT令牌
// 这里只是一个示例,实际项目中需要根据具体需求生成合适的令牌
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + 86400000))
.signWith(Keys.secretKeyFor(SignatureAlgorithm.HS512))
.compact();
}
}
public class LoginRequest {
private String username;
private String password;
// getters and setters
}
@Component
public class JwtInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// 从请求头中获取JWT令牌
String token = request.getHeader("Authorization");
// 验证JWT令牌的逻辑,例如检查令牌是否有效
if (validateToken(token)) {
// 令牌有效,将令牌中的用户信息保存到请求的attribute中,以便后续逻辑使用
String username = extractUsernameFromToken(token);
request.setAttribute("username", username);
return true;
} else {
// 令牌无效,返回401 Unauthorized错误
response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
return false;
}
}
private boolean validateToken(String token) {
// 使用JWT库验证JWT令牌的有效性
// 这里只是一个示例,实际项目中需要根据具体需求验证令牌
try {
Jwts.parserBuilder()
.setSigningKey(Keys.secretKeyFor(SignatureAlgorithm.HS512))
.build()
.parseClaimsJws(token);
return true;
} catch (Exception e) {
return false;
}
}
private String extractUsernameFromToken(String token) {
// 使用JWT库从令牌中解析出用户名
// 这里只是一个示例,实际项目中需要根据具体需求解析令牌
return Jwts.parserBuilder()
.setSigningKey(Keys.secretKeyFor(SignatureAlgorithm.HS512))
.build()
.parseClaimsJws(token)
.getBody()
.getSubject();
}
}
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Autowired
private JwtInterceptor jwtInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(jwtInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/login"); // 登录请求不需要验证JWT令牌
}
}
请注意,这只是一个简单的示例代码,实际项目中可能需要根据具体的需求进行修改和扩展。