gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:00:59 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com