java - 使用 ContainerRequestFilter 在 Jersey WebService 中自定义 @RolesAllowed 角色

标签 java jakarta-ee jersey jax-rs servlet-filters

我使用 ContainerRequestFilter 接口(interface)创建了一个过滤器,并尝试分配返回用户实体的自定义角色。

 @Override
public ContainerRequest filter(ContainerRequest request) {
    User user = authenticate(request);
    if (user != null) {
        request.setSecurityContext(new Authorizer(user));
    } else {
        throw new WebApplicationException(400);
    }
    return request;

}

 private User authenticate(ContainerRequest request) {

    user = new User("erhan", "customRole");


    return user;
}

public class Authorizer implements SecurityContext {

    private User user;
    private Principal principal;

    public Authorizer(final User user) {
        this.user = user;
        this.principal = new Principal() {

            public String getName() {
                return user.username;
            }
        };
    }

    public Principal getUserPrincipal() {
        return this.principal;
    }

    public boolean isUserInRole(String role) {
        return (role.equals(user.role));
    }

    public boolean isSecure() {
        return "https".equals(uriInfo.getRequestUri().getScheme());
    }

    public String getAuthenticationScheme() {
        return SecurityContext.BASIC_AUTH;
    }
}

public class User {

    public String username;
    public String role;

    public User(String username, String role) {
        this.username = username;
        this.role = role;
    }
}

那个过滤器一切都很好,但是当它进入网络服务时

 @GET
 @RolesAllowed({"customRole"})
 @Path("/test")
 public String getByType(@Context HttpHeaders headers,@Context SecurityContext sc,
                                 @Context HttpServletRequest request) {



   return null;
 }

它到达网络服务但是当我改变角色时,仍然到达相同的网络服务。我如何在 Jersey 中提供不同的自定义角色?

最佳答案

使用 Jersey 2,您只需注册 RolesAllowedDynamicFeature 并在 web.xml 中保护您的应用程序。比你不需要自定义 SecurityContext 实现。

参见 Jersey custom SecurityContext on EJB jax-rs resource有关详细信息。

关于java - 使用 ContainerRequestFilter 在 Jersey WebService 中自定义 @RolesAllowed 角色,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9591227/

相关文章:

java - 如何防止 Eclipse 自动删除我的 exe 文件

java - 使用正则表达式捕获列表中的多个元素

java - 使用 java 尽可能减少文件大小

java - JPA:读取并坚持一个事务,同时阻塞不同线程中的读取

java - 预处理数据以进行报告

java - java Jersey 2.1客户端线程安全吗?

java - Docker 运行失败并出现 NoClassDefFoundError - 即使依赖的 jar 位于类路径中

java - Quarkus:数据源自定义凭据提供程序

javascript - $http header存在跨域访问问题

java - Jersey Rest 服务具有 HTTP 基本安全性,不接受用户