【发布时间】:2020-11-29 17:25:40
【问题描述】:
希望你们都做得很好!我正在 Spring Boot 中实现基于 JWT 角色的授权。
我已经能够实现它。我正在关注的教程是这个
https://github.com/only2dhir/spring-security-jwt
用户注册成功。然后我为该用户分配一个像 ADMIN 这样的角色。
现在我有了这个 api @GetMapping("/users")
应该由管理员访问。但是当我访问这个 api 时,它给了我这个错误
java.lang.NullPointerException: Cannot invoke "Object.toString()" because the return value of
"io.jsonwebtoken.Claims.get(Object)" is null
这个错误来自这些方法:
JwtTokenUtil:
public static final String AUTHORITIES_KEY = "scopes";
UsernamePasswordAuthenticationToken getAuthentication(final String token, final Authentication
exsitingAuth, final UserDetails userDetails){
final JwtParser jwtParser = Jwts.parser().setSigningKey(secret);
final Jws<Claims> claimsJws = jwtParser.parseClaimsJws(token);
final Claims claims = claimsJws.getBody();
final Collection<? extends GrantedAuthority> authorities=
java.util.Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(","))
.map(SimpleGrantedAuthority::new)
.collect(Collectors.toList());
return new UsernamePasswordAuthenticationToken(userDetails, "", authorities);
}
这一行给出错误
java.util.Arrays.stream(claims.get(AUTHORITIES_KEY).toString().split(","))
创建身份验证:
UserDetailsWithToken UserDetailsWithToken = new UserDetailsWithToken();
authenticate(authenticationRequest.getEmpID(),
authenticationRequest.getPswd());
final UserDetails userDetails =
userDetailsService.loadUserByUsername(authenticationRequest.getEmpID());
final Authentication authentication = authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
authenticationRequest.getEmpID(),
authenticationRequest.getPswd()
)
);
SecurityContextHolder.getContext().setAuthentication(authentication);
final String token =
jwtTokenUtil.generateToken(userDetails,authentication);
【问题讨论】:
-
尝试将
claims.get(AUTHORITIES_KEY)打印到您的日志或控制台。它看起来像什么? -
打印到日志是什么意思?我正在使用邮递员测试我的api。我的应用程序还没有前端。 @TimBiegeleisen
-
能否提供创建token的代码?
-
@gaetanTEMATE 请查看我更新的问题
标签: spring-boot spring-security jwt