java - Jersey REST-Servlet 中的 RolesAllowed 注释不起作用

标签 java security tomcat jersey authorization

我有一个使用 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/

相关文章:

java - 在 while(rset.next) 内调用方法时耗尽结果集

java - Java 中的 Graphql 与复杂对象

tomcat - 如何在 Tomcat-OpenEJB 中部署 EJB 2.0、JAR 和 EAR?

ios - 火力地堡 ".read": "auth != null && auth.uid == $uid" not working as expected

web-applications - Maven 的 tomcat :run mojo doesn't see my servlet

java - 如何知道 Spring/CXF 何时准备好接受请求?

java - 谁能帮我设置开发生态环境的代理服务器?

java - Android Studio 中的新 Activity 无法启动

java - 从 Java 反射中隐藏我的安全 key

java - 如何清理 HttpServletRequest 中 getCookies()、getRequestURL() 的返回值?