这是我的 jwt 令牌提供程序类:
@Component
public class JwtTokenProvider {
@Value("${security.jwt.token.secret-key:secret-key}")
private String secretKey;
@Value("${security.jwt.token.expire-length:3600000}")
private long validityInMilliseconds = 3600000; // 1h
@Autowired
private MyUserDetails myUserDetails;
@PostConstruct
protected void init() {
secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes());
}
public String createToken(String username, List<Roles> roles) {
Claims claims = Jwts.claims().setSubject(username);
claims.put("auth", roles.stream().map(s -> new SimpleGrantedAuthority(((GrantedAuthority) s).getAuthority()))
.filter(Objects::nonNull).collect(Collectors.toList()));
Date now = new Date();
Date validity = new Date(now.getTime() + validityInMilliseconds);
return Jwts.builder()//
.setClaims(claims)//
.setIssuedAt(now)//
.setExpiration(validity)//
.signWith(SignatureAlgorithm.HS256, secretKey)//
.compact();
}
public Authentication getAuthentication(String token) {
UserDetails userDetails = myUserDetails.loadUserByUsername(getUsername(token));
return new UsernamePasswordAuthenticationToken(userDetails, "", userDetails.getAuthorities());
}
public String getUsername(String token) {
return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody().getSubject();
}
public String resolveToken(HttpServletRequest req) {
String bearerToken = req.getHeader("Authorization");
if (bearerToken != null && bearerToken.startsWith("Bearer ")) {
return bearerToken.substring(7);
}
return null;
}
public boolean validateToken(String token) {
try {
Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token);
return true;
} catch (JwtException | IllegalArgumentException e) {
throw new CustomException("Expired or invalid JWT token", HttpStatus.INTERNAL_SERVER_ERROR);
}
}
}
这是我的 MyUserDetails 类:
public class MyUserDetails implements UserDetails {
/**
*
*/
private static final long serialVersionUID = -8365671671277060768L;
private User user;
public MyUserDetails(User user) {
this.user=user;
}
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
Set<Roles> roles=user.getRoles();
List<SimpleGrantedAuthority> authorities = new ArrayList<>();
for(Roles role:roles) {
authorities.add(new SimpleGrantedAuthority(role.getName()));
}
return authorities;
}
@Override
public String getPassword() {
// TODO Auto-generated method stub
return user.getPassword();
}
@Override
public String getUsername() {
// TODO Auto-generated method stub
return user.getUsername();
}
@Override
public boolean isAccountNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isAccountNonLocked() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isCredentialsNonExpired() {
// TODO Auto-generated method stub
return true;
}
@Override
public boolean isEnabled() {
// TODO Auto-generated method stub
return user.isEnabled();
}
public UserDetails loadUserByUsername(String username) {
// TODO Auto-generated method stub
return null;
}
}
这是我得到的错误:
<块引用>说明:
com.yogi.security.jwtConfiguration.JwtTokenProvider 中的字段 myUserDetails 需要一个无法找到的“securityapplied.MyUserDetails”类型的 bean。
注入点有以下注释:
@org.springframework.beans.factory.annotation.Autowired(required=true)
操作:
考虑在您的配置中定义一个“securityapplied.MyUserDetails”类型的 bean。
答案 0 :(得分:0)
JwtTokenProvider 类正在尝试注入 MyUserDetails 类。 但是 MyUserDetails 类不能作为 bean 使用,因此出现异常“考虑在您的配置中定义一个类型为 'securityapplied.MyUserDetails' 的 bean”。
尝试使用 @Component 注释 MyUserDetails 类,例如:
@Component
public class MyUserDetails implements UserDetails {