当前位置: 首页 > 知识库问答 >
问题:

使用不起作用的角色批注进行保护(泽西岛)

解浩渺
2023-03-14

我是新来的,尽管我以前已经在这里找到了很多问题的答案。

现在我正在寻求帮助:我的小REST API上有这个小示例资源:

@Path("/greeting")
@PermitAll
public class HelloResource {

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @Path("all")
    public String sayHelloToAll() {
        return "Hello, everybody!";
    }

    @GET
    @Produces(MediaType.TEXT_PLAIN)
    @RolesAllowed("admin")
    @Path("admin")
    public String sayHelloToAdmin() {
        return "Hello, admin!";
    }
}

为了过滤角色,我有以下SecurityContext的实现:

public class Authorizer implements SecurityContext {

    @Override
    public String getAuthenticationScheme() {
        return null;
    }

    @Override
    public Principal getUserPrincipal() {
        return null;
    }

    @Override
    public boolean isSecure() {
        return false;
    }

    @Override
    public boolean isUserInRole(String role) {
        return true;
    }
}

以及容器请求过滤器的这种实现:

@Provider
@Priority(Priorities.AUTHENTICATION)
public class AuthorizationFilter implements ContainerRequestFilter {

    @Override
    public void filter(ContainerRequestContext requestContext) throws IOException {
        requestContext.setSecurityContext(new Authorizer());
    }
}

这是我的应用程序类:

@ApplicationPath("/")
public class Application extends ResourceConfig {

    public Application() {
        super(HelloResource.class);
        register(AuthorizationFilter.class);
        register(RolesAllowedDynamicFeature.class);        
    }
}

有了所有这些,当我请求URI问候/all时,一切都很好,显示字符串“Hello,大家好!”。但是当我请求URI问候/admin时,即使我的isUserInRole方法总是返回true,也永远不会调用它。事实上,我的过滤器方法总是被调用,但我的isUserInRole方法永远不会被调用。

我遵循了许多建议:

SecurityContext不能与@RolesAllowed一起使用

角色授权允许动态特征和泽西岛

如何访问新泽西资源由@Rele准许保护

使用JAX-RS和泽西进行基于REST令牌的身份验证的最佳实践

但它似乎对任何东西都不起作用。

有人能帮我吗?我不知道,是不是我错过了什么

提前感谢大家。

编辑:当我请求URI问候/管理员时,顺便问一下,我得到403禁止(我忘了说)

共有1个答案

钦良弼
2023-03-14

查看<code>RoleAllowedRequestFilter<code>的源代码。当用户通过身份验证时,预期会有一个关联的主体。过滤器在这里检查它

if (rolesAllowed.length > 0 && !isAuthenticated(requestContext)) {
    throw new ForbiddenException(LocalizationMessages.USER_NOT_AUTHORIZED());
}
...
private static boolean isAuthenticated(final ContainerRequestContext requestContext) {
    return requestContext.getSecurityContext().getUserPrincipal() != null;
}

因此,您需要在< code>SecurityContext的< code>getUserPrincipal中返回一个< code>Principal

@Override
public Principal getUserPrincipal() {
    return new Principal() {
        @Override
        public String getName() {
            return "Some Name";
        }
    };
}
 类似资料:
  • 我有一些问题。我为我的应用程序使用了Spring Security,当我标记方法注释@安全(“ROLE_ADMIN”)时,它不起作用。 这security-config.xml 身份验证有效。数据库中的角色是正确的。此代码也有效。

  • 问题内容: 我当时在看使用Jersey的优秀REST教程。在页面下方,构建了一个Web资源,该资源的标题为它本身包含两个实例变量 我想知道确切地如何初始化实例变量和实例变量?我知道使用注释可以注入信息,但是什么时候发生?泽西岛会自动处理吗? 问题答案: Jersey 不会修改 类,但 会 在客户端的每个请求中 创建 它。 之后 类的构造函数被调用,上下文字段注入。 (如果您尝试访问构造函数中的那些

  • 在代码中使用XSLT 2.0的字符映射功能时,我遇到了以下错误。 名称空间中的元素“样式表”http://www.w3.org/1999/XSL/Transform'命名空间中的子元素'character map'无效'http://www.w3.org/1999/XSL/Transform“是的 这是我的XSLT声明 请提供有关如何在XSLT中使用字符映射的帮助。

  • 我的Java应用程序中有多个用户角色。下面是我的代码: 错误: 因此,所发生的情况是,它加载了用户数据的URL访问权限,但当执行最后一行时,它将/dashboard URL更改为具有ADMIN访问权限。我的角色仍然是数据角色,因此不能访问/dashboard URL。 最后一行似乎覆盖了其他行。再来看看URL特权,如果我删除“/dashboard”,那么当涉及到“/data”URL时,我会得到同样

  • 问题内容: 我试图弄清楚@Consumes在这里如何工作。 我有一个如下所示的简化资源,并且我只希望此资源使用“ application / vnd.myApp + xml”。 我有以下测试用例: 从上面的3个测试中,#2和#3按预期工作。 至于#1,如果我没有设置content-type,为什么它也不会抛出415? 问题答案: 基于@Consumes api(http://jsr311.java

  • 我似乎对JFreeChart XYPlot中的测试注释有问题。我可以如下设置文本注释 我还可以通过添加 但是如果我试图改变字体类型/大小或颜色,它似乎不起作用 字体保持黑色,并为默认类型/大小。奇怪的是,在烛台图表上,功能似乎很好,但不是简单的绘图 其他人有没有经历过这种情况,或者我做错了什么? ======== 我似乎已经解决了这个问题。在我的烛台图表代码中,数据集在构建时添加到图表中。添加文本