簡體   English   中英

SecurityContext不適用於@RolesAllowed

[英]SecurityContext doesn't work with @RolesAllowed

我目前正在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 - 禁止。

提前謝謝你們

確保在MyApplication注冊了AuthorizationFilter (請參閱在Jersey 2中注冊資源和提供程序 )或使用@Provider注釋(以使程序包掃描可以發現它)。

為了使用安全注釋(包javax.annotation.security )來限制對資源的訪問,您需要注冊RolesAllowedDynamicFeature

編輯1

您的AuthorizationFilter也必須使用@PreMatching進行注釋,這意味着在匹配階段(uri - > resource)之前調用過濾器。 否則, RolesAllowedDynamicFeature注冊的過濾器(在此階段調用)將不會看到自定義的SecurityContext

編輯2

Jersey用戶指南 - 授權 - 保護資源

在實際應用程序中,定義自己的ResourceConfig意味着每次添加新資源(類)時都必須對其進行編輯。

避免該問題的一個好方法是將<init-param>RolesAllowedDynamicFeature類注冊到web.xml<servlet> ,如下所示:

<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>

如果您這樣做,那么您可以將其放入以動態注冊特定包中的所有資源:

    <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>

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM