jakarta-ee - SecurityContext不适用于@RolesAllowed

标签 jakarta-ee jersey tomcat7 jax-rs

我目前正在Tomcat 7中使用Jersey 2.5.1创建后端服务器。为了安全起见,我使用了@RolesAllowed@PermitAll等批注,并且创建了自定义的ContainerRequestFilterSecurityContext

我的问题是,即使我强制@RolesAllowed方法返回isUserInRole(role),当请求我的带有true注释的资源时,该资源也会始终拒绝权限。但是,我的filter方法被调用了。你有什么建议吗?我将在下面粘贴一些相关代码。

我的ContainerRequestFilter实现:

public class AuthorizationFilter implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext request) throws IOException
    {
        request.setSecurityContext(new Authorizer());
    }
}

我的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;
    }

}

我的资源:
@Path("/secure")
public class TestSecureResource {

    @GET
    @PermitAll
    @Path("/nonsec_test/{text}")
    public Response nonSecureTest(
            @PathParam("text") String text){

        return Response.status(200).entity(text).build();
    }

    @GET
    @RolesAllowed("admin")
    @Path("/sec_test/{text}")
    public Response secureTest(
            @PathParam("text") String text){

        return Response.status(200).entity(text).build();
    }
}

我的ResourceConfig:
@ApplicationPath("/")
public class MyApplication extends ResourceConfig {

    public MyApplication() {
        super(TestSecureResource.class);
        register(RolesAllowedDynamicFeature.class);
        register(AuthorizationFilter.class);
    }
}

我的web.xml的相关部分:
<servlet-name>Jersey Web Application</servlet-name>
        <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>

        <init-param>
            <param-name>jersey.config.server.provider.packages</param-name>
            <param-value>pkg.backend</param-value>
        </init-param>

        <init-param>
            <param-name>javax.ws.rs.Application</param-name>
            <param-value>pkg.backend.MyApplication</param-value>
        </init-param>

        <load-on-startup>1</load-on-startup>
    </servlet>

在这种情况下,我对secureTest的访问始终被拒绝。澄清事物我正在获取HTTP状态代码403-禁止。

预先谢谢你们

最佳答案

确保您已将自己的AuthorizationFilter注册在MyApplication中(请参阅Registering Resources and Providers in Jersey 2)或使用@Provider进行了注释(以使其可通过程序包扫描发现)。

为了使用安全注释(软件包javax.annotation.security)来限制对资源的访问,您需要注册RolesAllowedDynamicFeature

编辑1

您的AuthorizationFilter也必须加上@PreMatching注释,这意味着在匹配阶段(uri-> resource)之前调用过滤器。否则,由RolesAllowedDynamicFeature注册的过滤器(在此阶段调用)将看不到自定义SecurityContext

编辑2

Jersey 用户指南-Authorization - securing resources

关于jakarta-ee - SecurityContext不适用于@RolesAllowed,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21536321/

相关文章:

java - 如何在 Apache Ace 中测试或查看已安装的 OSGI 包

apache - AJP 连接器不工作? (404 错误)

Liferay项目的架构?

java - jersey-spring3 (2.25.1) 在 jetty-9.3.3 中产生 "Failed startup of context"错误

java - 在 Java GUI 中使用 Int

java - Jersey-test-framework 无用的回溯 JerseyTest

java - Grizzly 服务器上的基本身份验证

java - 405 获取资源时出错

tomcat - Tomcat web.xml 描述符中的独有 url 模式

java - 在 spring-security 中将基于命名空间的配置与不同的身份验证方法相结合