我有一个使用 Jersey3、Tomcat 10 和来自 Tomcat 的 DataSourceRealm 进行身份验证的网络应用程序。
运行 Servlet 工作顺利,但授权似乎没有发生,因为每个经过身份验证的用户都可以访问资源,即使这些方法用 进行了注释。 @RolesAllowed
我的 Controller 看起来像这样:
@Path("/dataset")
public class DatasetController {
@RolesAllowed({"1, 3"})
@GET
@Produces(MediaType.APPLICATION_JSON)
public Response getAllEntries(@DefaultValue("1") @QueryParam("state") int state)
web.xml 看起来像这样: <!-- URL-Mappings -->
<servlet-mapping>
<servlet-name>Hello Word</servlet-name>
<url-pattern>/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Entries REST Endpoint</servlet-name>
<url-pattern>/api/*</url-pattern>
</servlet-mapping>
<!-- Security Roles -->
<security-role>
<role-name>1</role-name>
</security-role>
<security-role>
<role-name>2</role-name>
</security-role>
<security-role>
<role-name>3</role-name>
</security-role>
<!-- Login Config -->
<login-config>
<auth-method>BASIC</auth-method>
</login-config>
<!-- Security Constraints-->
<security-constraint>
<web-resource-collection>
<web-resource-name>REST Endpoint</web-resource-name>
<url-pattern>/api/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>1</role-name>
<role-name>2</role-name>
<role-name>3</role-name>
</auth-constraint>
</security-constraint>
我在调试时检查了 SecurityContext,经过身份验证的用户获得了正确的角色,例如sc.isUserInRole("1/2/3")
表示身份验证工作正常。角色必须被称为 1,2,3 但这似乎不是问题。我错过了什么?感谢您的任何意见!
最佳答案
因此,您可以使用两种不同的授权机制:一种由 Servlet 容器提供,另一种由 Jersey 提供。使用 Servlet 容器提供的那个,您可以在 web.xml 中配置所有角色和安全性。所有@RolesAllowed
使用 Servlet 容器授权时,注解不起作用。
然后你有 Jersey 的授权。使用 Jersey,它将从 Servlet 容器认证中获取已认证的用户,并根据 @RolesAllowed
进行授权。注释。如果您想使用泽西授权,您只需注册RolesAllowedDynamicFeature
.
要使用 Jersey 的授权,首先删除您在 web.xml 中的所有授权配置。那么如果您使用的是 ResourceConfig
对于您的应用程序配置,只需使用以下内容注册该功能。
register(RolesAllowedDynamicFeature.class);
如果您使用 web.xml 进行应用程序配置,请使用以下 init-param<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
</init-param>
这几乎就是让授权工作。对于遇到这篇文章的其他人,请记住 OP 正在使用 Servlet 容器身份验证。如果您这样做,那么您需要做的就是注册
RolesAllowedDynamicFeature
获得授权。如果你不使用 Servlet 容器认证,那么你需要实现你自己的认证过滤器,你需要在这里进行认证,然后设置 SecurityContext。看看this post了解更多信息。
关于java - Jersey REST-Servlet 中的 RolesAllowed 注释不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66471750/