org.springframework.web.client.HttpClientErrorException$Unauthorized: 401 null
时间: 2023-10-28 19:56:49 浏览: 424
这个错误通常表示您没有提供正确的身份验证凭据来访问受保护的资源。您需要检查您的身份验证凭据,例如用户名和密码或令牌,并确保它们是正确的。您还需要检查您的请求头中是否包含了正确的身份验证信息。如果您使用的是OAuth 2.0或其他身份验证协议,请确保您正确地实现了身份验证流程。最后,您还需要检查您正在尝试访问的资源是否需要身份验证。如果是,则您需要确保您提供了正确的凭据才能访问它。
相关问题
Spring Cloud +JWT +MybatisPlus,使用Token登录详细教程,附源码!
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登录的核心指导。
阅读全文