我最近在Spring启动应用程序中使用spring security实现了JWT身份验证。当/login
发出请求时,JWTAuthenticationFilter
会执行。
public class JWTAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
private AuthenticationManager authenticationManager;
public JWTAuthenticationFilter( AuthenticationManager authenticationManager )
{
this.authenticationManager = authenticationManager;
}
@Override
public Authentication attemptAuthentication( HttpServletRequest req, HttpServletResponse res )
throws AuthenticationException
{
try
{
UserModel creds = new ObjectMapper().readValue(req.getInputStream(), UserModel.class);
return authenticationManager.authenticate(new UsernamePasswordAuthenticationToken(creds.getMobileNumber(),
creds.getPassword(), new ArrayList<>()));
}
catch( IOException e )
{
throw new RuntimeException(e);
}
}
@Override
protected void successfulAuthentication( HttpServletRequest req, HttpServletResponse res, FilterChain chain,
Authentication auth ) throws IOException, ServletException
{
String token = Jwts.builder().setSubject(((User) auth.getPrincipal()).getUsername())
.setExpiration(new Date(System.currentTimeMillis() + 360000000))
.signWith(SignatureAlgorithm.HS512, SecurityConstants.SECRET).compact();
res.addHeader(SecurityConstants.HEADER_STRING, SecurityConstants.TOKEN_PREFIX + token);
res.setStatus(HttpServletResponse.SC_OK);
String tokenJsonResponse = new ObjectMapper().writeValueAsString("Ok");
res.addHeader("Content-Type", "application/json");
res.getWriter().print(tokenJsonResponse);
}
}
我想在发送之前向JWT添加角色。如何在JWT中添加角色?
我从代码中理解的是,当登录请求到来时,它包含userName
和password
,ObjectMapper
将其映射到指定的一个类。那么如何从数据库中为该用户提取角色呢?
答案 0 :(得分:2)
从身份验证中获取角色
Set<String> roles = authentication.getAuthorities().stream()
.map(r -> r.getAuthority()).collect(Collectors.toSet());
然后你可以创建一个Helper类来保存用户和角色的数据, 并将此类用作Jwts构建器的主题。
答案 1 :(得分:0)
使用声明(&#34;键&#34;,&#34;值&#34;)。这会为JWT的声明添加角色。
例如:JWT声称如下所示
// claim { &#34; sub&#34;:&#34; test@example.com", &#34; name&#34;:&#34;测试示例&#34;, &#34;角色&#34;:&#34;用户&#34; }
尝试以下代码段。
String token = Jwts.builder().setSubject(((User) auth.getPrincipal()).getUsername())
.claim("role", "user")
.setExpiration(new Date(System.currentTimeMillis() + 360000000))
.signWith(SignatureAlgorithm.HS512, SecurityConstants.SECRET).compact();
如果有效,请告诉我们。