Spring Cloud +JWT +MybatisPlus,使用Token登录详细教程,附源码!
时间: 2024-09-11 08:05:45 浏览: 65
Spring Cloud + JWT + MybatisPlus 的组合为构建微服务架构的后端系统提供了一套完整的解决方案。在这种架构下,Token登录是常见的用户认证方式,它通过生成Token作为身份凭证,避免了在服务间传递用户信息,增强了安全性。以下是一个简化的教程,用于说明如何使用这些技术实现Token登录:
1. **项目依赖和配置**:
首先,你需要在项目的`pom.xml`文件中添加Spring Cloud、JWT、MybatisPlus等相关依赖。这里仅列举关键依赖,具体版本根据实际需求选择:
```xml
<!-- Spring Boot Starter -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- Spring Cloud Starter -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
</dependency>
<!-- Mybatis Plus -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.x.x</version>
</dependency>
<!-- JWT -->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
```
2. **配置JWT**:
在`application.yml`或`application.properties`中配置JWT的密钥和Token过期时间:
```yaml
jwt:
secret: your-secret-key
expiration: 3600000 # Token过期时间,单位毫秒
```
3. **创建Token生成和验证工具类**:
使用JWT提供的工具类来生成和验证Token。通常会创建一个`JwtUtil`类来完成这个任务:
```java
@Component
public class JwtUtil {
// 获取Token的工具方法
public static String generateToken(String username) {
// 使用HS512算法和密钥生成Token
return Jwts.builder()
.setSubject(username)
.setExpiration(new Date(System.currentTimeMillis() + expiration))
.signWith(SignatureAlgorithm.HS512, secret)
.compact();
}
// 验证Token的工具方法
public static Claims getClaimsFromToken(String token) {
try {
return Jwts.parser()
.setSigningKey(secret)
.parseClaimsJws(token)
.getBody();
} catch (Exception e) {
return null;
}
}
}
```
4. **创建用户认证接口**:
实现一个基于Token的用户认证接口,该接口接收用户名和密码,验证通过后返回Token:
```java
@RestController
public class AuthController {
@PostMapping("/login")
public ResponseEntity<?> createAuthenticationToken(@RequestBody LoginUserDto loginUserDto) {
// 这里简化了用户验证和密码加密的过程,实际开发中应使用安全的密码验证方式
if (userExistsAndValid(loginUserDto.getUsername(), loginUserDto.getPassword())) {
String token = JwtUtil.generateToken(loginUserDto.getUsername());
return ResponseEntity.ok(new JwtResponse(token));
} else {
return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid credentials");
}
}
private boolean userExistsAndValid(String username, String password) {
// 检查用户是否存在和密码是否正确
return true;
}
}
```
5. **创建Token验证过滤器**:
创建一个过滤器,用于在请求到达Controller前拦截并验证Token的有效性:
```java
@Component
public class JwtTokenFilter extends OncePerRequestFilter {
@Override
protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
throws ServletException, IOException {
// 从请求头中获取Token
String token = request.getHeader("Authorization");
if (token != null && !token.isEmpty()) {
try {
// 验证Token
Claims claims = JwtUtil.getClaimsFromToken(token.replace("Bearer ", ""));
// 如果验证成功,则将用户名设置到请求中供后续使用
request.setAttribute("username", claims.getSubject());
filterChain.doFilter(request, response);
} catch (Exception e) {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid Token");
}
} else {
response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Token is missing");
}
}
}
```
6. **配置Spring Security**:
配置Spring Security来使用JWT过滤器,并设置认证规则:
```java
@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private JwtTokenFilter jwtTokenFilter;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.csrf().disable()
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated();
// 添加JWT过滤器
http.addFilterBefore(jwtTokenFilter, UsernamePasswordAuthenticationFilter.class);
}
}
```
以上是基于Spring Cloud + JWT + MybatisPlus 实现Token登录的一个大致流程。在实际开发中,你需要根据具体业务逻辑完善用户服务、密码验证和用户管理等环节。此外,源码通常涉及到整个项目的结构和业务逻辑,这里无法提供完整的源码,但上述步骤可作为实现Token登录的核心指导。
阅读全文