基于角色的身份验证在Java中的Restful端点上

问题描述 投票:0回答:1

我正在尝试实现某种基于角色的身份验证。我正在使用JWT令牌。我一直在看导游,但他们都提到了“弹簧靴”的使用。如何在Java中的restful端点上设置基于角色的身份验证?最好通过某种过滤器。

我正在寻找一种方法来简单地在端点之前添加:@Role(Role.ADMIN)

我已经设置了以下类:

  • 枚举角色: public enum Role { User, Admin }
  • 简单的JWT令牌: { "sub": "users/TzMUocMF4p", "exp": 1554646441, "username": "[email protected]", "ID": 6, "Role": "Admin", "iat": 1554641041 }
  • 简单的CRUD端点 @Path("User") public class UserResource { @EJB private UserDAO userappDAO; @GET @JWTTokenNeeded @Produces("application/json") public List<Userapp> all() { return userappDAO.getAll(); } }
  • JWT验证(qazxsw poi)课程如下: @JWTTokenNeeded 实际过滤器: qazxsw poi

如果用户未获得授权,我想退出:@javax.ws.rs.NameBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface JWTTokenNeeded { }

如果用户被授权,端点必须这样做。

java java-ee jwt jax-rs restful-authentication
1个回答
2
投票

我找到了一个有效的解决方案。它包括在@Provider @JWTTokenNeeded @Priority(Priorities.AUTHENTICATION) public class JWTTokenNeededFilter implements ContainerRequestFilter { @Override public void filter(ContainerRequestContext requestContext) throws IOException { // Get the HTTP Authorization header from the request String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); try { // Extract the token from the HTTP Authorization header String token = authorizationHeader.substring("Bearer".length()).trim(); // Validate the token Jwts.parser().setSigningKey("MYSECRET".getBytes("UTF-8")).parseClaimsJws(token); } catch (Exception e) { requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build()); } } } 界面和requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build());类中添加几行。

我最终得到以下代码:

JWTTokenNeededFilter:

@JWTTokenNeeded

@JWTTokenNeeded接口:

JWTTokenNeededFilter

允许角色访问端点就像添加@Provider @JWTTokenNeeded @Priority(Priorities.AUTHENTICATION) public class JWTTokenNeededFilter implements ContainerRequestFilter { @Context private ResourceInfo resourceInfo; @Override public void filter(ContainerRequestContext requestContext) throws IOException { // Get the HTTP Authorization header from the request String authorizationHeader = requestContext.getHeaderString(HttpHeaders.AUTHORIZATION); try { // Extract the token from the HTTP Authorization header String token = authorizationHeader.substring("Bearer".length()).trim(); // Validate the token Claims claims = Jwts.parser().setSigningKey("MYSECRET".getBytes("UTF-8")).parseClaimsJws(token).getBody(); Method method =resourceInfo.getResourceMethod(); if( method != null){ // Get allowed permission on method JWTTokenNeeded JWTContext = method.getAnnotation(JWTTokenNeeded.class); Role permission = JWTContext.Permissions(); if(permission != Role.NoRights ) { // Get Role from jwt String roles = claims.get("Role", String.class); Role roleUser = Role.valueOf(roles); // if role allowed != role jwt -> UNAUTHORIZED if (!permission.equals(roleUser)) { throw new Exception("no roles"); } } } } catch (Exception e) { e.printStackTrace(); requestContext.abortWith(Response.status(Response.Status.UNAUTHORIZED).build()); } } } 一样简单

这是一个例子:

@javax.ws.rs.NameBinding
@Retention(RUNTIME)
@Target({TYPE, METHOD})
public @interface JWTTokenNeeded {
    Role Permissions() default Role.NoRights;
}
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.