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 了解更多信息。