【发布时间】:2019-08-28 18:28:04
【问题描述】:
我正在尝试实现某种基于角色的身份验证。我正在使用 JWT 令牌。我一直在看指南,但他们都提到了“Spring boot”的使用。如何在 Java 中的 restful 端点上设置基于角色的身份验证?最好通过某种过滤器。
我正在寻找一种在端点前简单添加:@Role(Role.ADMIN) 的方法。
我已经设置了以下课程:
-
枚举角色:
public enum Role { User, Admin } -
简单的 JWT 令牌:
{ "sub": "users/TzMUocMF4p", "exp": 1554646441, "username": "username@gmail.com", "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 验证 (
@JWTTokenNeeded) 类如下:@javax.ws.rs.NameBinding @Retention(RUNTIME) @Target({TYPE, METHOD}) public @interface JWTTokenNeeded { }实际过滤器:
@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());
如果用户被授权,端点必须这样做。
【问题讨论】:
-
我认为您正在寻找的是实现
@Interceptorstackoverflow.com/questions/18853221/… -
看看 MicroProfile JWT (eclipse.org/community/eclipse_newsletter/2017/september/…)。有了这个,您将获得从 JWT 令牌解析的
java.security.Principal,并且可以在您的 JAX-RS 端点上使用@RolesAllowed。有关更多信息,请查看以下帖子:rieckpil.de/…
标签: java jakarta-ee jwt jax-rs restful-authentication