我目前正在Tomcat 7中使用Jersey 2.5.1创建后端服务器。为了安全起见,我使用了@RolesAllowed
,@PermitAll
等批注,并且创建了自定义的ContainerRequestFilter
和SecurityContext
。
我的问题是,即使我强制@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/