Jersey REST-Servlet 中的 RolesAllowed 注释不起作用
RolesAllowed Annotation in Jersey REST-Servlet not working
我有一个使用 Jersey3、Tomcat 10 和来自 Tomcat 的 DataSourceRealm 进行身份验证的网络应用程序。
运行 一个 Servlet 工作顺利,但授权似乎没有发生,因为每个经过身份验证的用户都可以访问资源,即使这些方法被注释为 @RolesAllowed
我的控制器看起来像这样:
@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 中配置所有角色和安全性。使用 Servlet 容器授权时,所有 @RolesAllowed
注解均无效。
那么你就有了泽西岛的授权。使用 Jersey,它将从 Servlet 容器身份验证中获取经过身份验证的用户,并根据 @RolesAllowed
注释进行授权。如果你想使用Jersey授权,你只需要注册RolesAllowedDynamicFeature
.
要使用 Jersey 的授权,首先删除您在 web.xml 中的所有授权配置。然后,如果您在应用程序配置中使用 ResourceConfig
,只需使用以下内容注册该功能。
register(RolesAllowedDynamicFeature.class);
如果您使用 web.xml 进行应用配置,请使用以下初始化参数
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
</init-param>
这就是获得授权的全部内容。
对于遇到此问题的其他人 post,请记住 OP 正在使用 Servlet 容器 身份验证 。如果这样做,那么您需要做的就是注册 RolesAllowedDynamicFeature
以获得授权。如果不使用 Servlet 容器身份验证,则需要实现自己的身份验证过滤器,其中需要进行身份验证,然后设置 SecurityContext。查看 this post 了解更多信息。
我有一个使用 Jersey3、Tomcat 10 和来自 Tomcat 的 DataSourceRealm 进行身份验证的网络应用程序。
运行 一个 Servlet 工作顺利,但授权似乎没有发生,因为每个经过身份验证的用户都可以访问资源,即使这些方法被注释为 @RolesAllowed
我的控制器看起来像这样:
@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 中配置所有角色和安全性。使用 Servlet 容器授权时,所有 @RolesAllowed
注解均无效。
那么你就有了泽西岛的授权。使用 Jersey,它将从 Servlet 容器身份验证中获取经过身份验证的用户,并根据 @RolesAllowed
注释进行授权。如果你想使用Jersey授权,你只需要注册RolesAllowedDynamicFeature
.
要使用 Jersey 的授权,首先删除您在 web.xml 中的所有授权配置。然后,如果您在应用程序配置中使用 ResourceConfig
,只需使用以下内容注册该功能。
register(RolesAllowedDynamicFeature.class);
如果您使用 web.xml 进行应用配置,请使用以下初始化参数
<init-param>
<param-name>jersey.config.server.provider.classnames</param-name>
<param-value>org.glassfish.jersey.server.filter.RolesAllowedDynamicFeature</param-value>
</init-param>
这就是获得授权的全部内容。
对于遇到此问题的其他人 post,请记住 OP 正在使用 Servlet 容器 身份验证 。如果这样做,那么您需要做的就是注册 RolesAllowedDynamicFeature
以获得授权。如果不使用 Servlet 容器身份验证,则需要实现自己的身份验证过滤器,其中需要进行身份验证,然后设置 SecurityContext。查看 this post 了解更多信息。