我正在尝试在我的 sprin 启动应用程序中应用 auth0 安全性,但它引发了错误

时间:2021-07-20 05:25:25

标签: java spring spring-boot jwt auth0

这是我的 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。

1 个答案:

答案 0 :(得分:0)

JwtTokenProvider 类正在尝试注入 MyUserDetails 类。 但是 MyUserDetails 类不能作为 bean 使用,因此出现异常“考虑在您的配置中定义一个类型为 'securityapplied.MyUserDetails' 的 bean”。

尝试使用 @Component 注释 MyUserDetails 类,例如:

@Component
public class MyUserDetails implements UserDetails {
相关问题