Jakarta ee SecurityContext没有';不允许使用@RolesAllowed

Jakarta ee SecurityContext没有';不允许使用@RolesAllowed,jakarta-ee,jersey,tomcat7,jax-rs,Jakarta Ee,Jersey,Tomcat7,Jax Rs,我目前正在Tomcat7中使用Jersey 2.5.1创建一个后端服务器。为了安全起见,我使用了@RolesAllowed、@PermitAll等注释,并创建了自定义的ContainerRequestFilter和SecurityContext 我的问题是,当请求我的@RolesAllowed带注释的资源时,它总是拒绝权限,即使我强制我的isUserInRole(role)方法返回true。但是,会调用我的filter方法。你有什么建议吗?我将在下面粘贴一些相关代码 MyContainerReq

我目前正在Tomcat7中使用Jersey 2.5.1创建一个后端服务器。为了安全起见,我使用了
@RolesAllowed
@PermitAll
等注释,并创建了自定义的
ContainerRequestFilter
SecurityContext

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

My
ContainerRequestFilter
实现:

public class AuthorizationFilter implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext request) throws IOException
    {
        request.setSecurityContext(new Authorizer());
    }
}
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;
    }

}
我的
SecurityContext
实现:

public class AuthorizationFilter implements ContainerRequestFilter
{
    @Override
    public void filter(ContainerRequestContext request) throws IOException
    {
        request.setSecurityContext(new Authorizer());
    }
}
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);
    }
}
my
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>
Jersey Web应用程序
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.packages
pkg.backend
javax.ws.rs.Application
pkg.backend.MyApplication
1.
在这种特定情况下,我对
secureTest
的访问总是被拒绝。澄清事情;我得到HTTP状态码403-禁止


提前感谢各位

请确保您的
授权过滤器
已在
我的应用程序
中注册(请参阅)或添加批注(以便通过包扫描发现)

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

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

编辑2
Jersey User Guide-

在实际应用程序中,定义自己的
ResourceConfig
意味着您必须在每次添加新资源(类)时对其进行编辑

避免该问题的一个好方法是将
中的
角色AllowedDynamicFeature
类注册到
web.xml中的
,如下所示:

<servlet>
    <servlet-name>your_servelet_name</servlet-name>
    <servlet-class>org.glassfish.jersey.servlet.ServletContainer</servlet-class>
    <init-param>
        <param-name>jersey.config.server.provider.classnames</param-name>
        <param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
    </init-param>

你的姓
org.glassfish.jersey.servlet.ServletContainer
jersey.config.server.provider.classnames
org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature
如果您这样做,则可以将其放入以动态注册特定包中的所有资源:

    <init-param>
        <param-name>jersey.config.server.provider.packages</param-name>
        <param-value>com.your-domain.your-packages-1,com.your-domain.your-packages-2</param-value>
    </init-param>

jersey.config.server.provider.packages
com.your-domain.your-packages-1、com.your-domain.your-packages-2

感谢您的精彩回复。我注意到我忘记粘贴问题中扩展ResourceConfig的MyApplication,它将在编辑中添加。。我已经注册了AuthorizationFilter和RoleSalowedDynamic功能。现在还添加了@Provided,但我仍然无法在SecurityContext中触发该方法。很好的链接,顺便说一句,我会看一看。我的道歉,忘记了
@PreMatching
。增加了编辑1。