JWT中基于角色的授权

时间:2017-11-05 17:32:53

标签: spring-boot spring-security jwt

我最近在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中添加角色? 我从代码中理解的是,当登录请求到来时,它包含userNamepasswordObjectMapper将其映射到指定的一个类。那么如何从数据库中为该用户提取角色呢?

2 个答案:

答案 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();

如果有效,请告诉我们。