如何使用spring security和java在jwt json中传递角色或权限

Posted

技术标签:

【中文标题】如何使用spring security和java在jwt json中传递角色或权限【英文标题】:How to pass role or authorities in jwt json, using spring security and java 【发布时间】:2021-06-03 11:31:40 【问题描述】:

我想为 Redux 传递 JWT 中的角色或权限,这是因为有更好的方法来根据我的设计授予访问权限(可能不是最好的),因为我是中级,我对如何传递感到困惑它在构建 jwt 时,这是配置(我学习的方式);

public String generateToken(Authentication authentication)

    User user = (User) authentication.getPrincipal();
    Date now = new Date(System.currentTimeMillis());
    Date expiryDate = new Date(now.getTime()+ SecurityConstants.EXPIRATION_TIME); 
    String userId = Long.toString(user.getId());
   
    Map<String, Object> claims = new HashMap<>();
    claims.put("id", (Long.toString(user.getId())));
    claims.put("username", user.getUsername());


    return Jwts.builder() //WE create the token like this
            .setSubject(userId)
            .setClaims(claims)
            .setIssuedAt(now)
            .setExpiration(expiryDate)
            .signWith(SignatureAlgorithm.HS512, SecurityConstants.SECRET)
            .compact();


//Validate token in API
public boolean validateToken (String token)
    try
        Jwts.parser().setSigningKey(SecurityConstants.SECRET).parseClaimsJws(token);
        return true;
    catch (SignatureException ex)
        System.out.println("Invalid JWT signature");
    catch (MalformedJwtException ex)
        System.out.println("Invalid JWT token");
    catch (ExpiredJwtException ex)
        System.out.println("Expired JWT token");
    catch (UnsupportedJwtException ex)
        System.out.println("Unsupported JWT token");
    catch (IllegalArgumentException ex)
        System.out.println("JWT claims string is empty");
     return false;


//GET userId from token
public Long getUserIdFromJWT(String token)
    Claims claims = Jwts.parser().setSigningKey(SecurityConstants.SECRET).parseClaimsJws(token).getBody();
    String id = (String)claims.get("id");

    return Long.parseLong(id);

我尝试在 builder 和 generateToken 中以多种方式添加它,但总是出错,我希望在此处添加它;

jwt in Redux image

在用户 jwt 中,我也想传递角色。 --->用户角色:“管理员”

任何建议或支持先谢谢你!

【问题讨论】:

【参考方案1】:

您可以使用声明来设置和获取用户角色,或者只是将登录名/用户 ID 查询到数据库中并检查它是否被授权。

Is setting Roles in JWT a best practice?

在您的示例中,您将在声明声明的正下方添加此 sn-p

claims.put("角色", user.getRole());

【讨论】:

确实我发现了一些其他不好的做法,但到​​目前为止我还在学习,谢谢!!

以上是关于如何使用spring security和java在jwt json中传递角色或权限的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 和 XML 配置在 Spring Security 中配置 jdbc 身份验证管理器?

如何在 Grails 应用程序和 Java 应用程序之间共享 Spring Security 类?

java.security.Principal - 在 HttpServletRequest 和 Spring Security 中创建

如何使用 Spring Security 检查 Java 代码中的“hasRole”?

如何从 Spring Security 中的 java 代码登录用户?

Spring Security 和 Shiro 该如何选择?