java - 在 Jersey-2 中应该如何使用 @DeclareRoles?
问题描述
我正在为几个简单的 RESTful API 尝试一个简单的球衣应用程序。我想在我的 API 端点上尝试基于角色的证券,但不确定如何?
注释是否应该像下面这样在 WebService 类上声明?
@Slf4j
@Path("/account")
@Autherization
@DeclareRoles("ADMIN", "STUDENT", "TEACHER")
public class AccountService extends SpringApplication {
private static Logger logger = Logger.getLogger("AuthenticationService");
@Path("/greet")
@GET
@Produces(MediaType.TEXT_PLAIN)
@PermitAll
public Response greet(){
logger.info("Welcome to Tarkshala Scholar Account APIs");
return getBean(AuthenticationServiceHandler.class).greet();
}
}
还是应该在过滤器上声明?
解决方案
所以 Jersey 已经用它的RolesAllowedDynamicFeature
. 只需在您的 Jersey 中注册即可ResourceConfig
。不需要@DeclareRoles
,因为这是一种 EJB 机制。泽西岛有自己独立的角色处理系统。
幕后发生的事情是,有一个ContainerRequestFilter
(用 注释@Priority(Priorities.AUTHORIZATION)
)检查您的资源方法以查看允许哪些角色,然后它SecurityContext
从 中获取ContainerRequestContext
并为在中声明的每个角色调用该SecurityContext#isUserInRole(String role)
方法@RolesAllowed
(如果有的话)。如果SecurityContext
没有通过检查,Jersey 会抛出ForbiddenException
.
因此,话虽如此,您需要为您的身份验证做的是创建一个ContainerRequestFilter
(用 注释@Priority(Priorities.AUTHENTICATION
),并在该过滤器中进行身份验证,然后创建一个SecurityContext
包含所有角色的 Jersey 以供检查。这种方法分离了关注点;一个用于身份验证的过滤器(我们创建的)和一个用于授权的过滤器(Jersey 为我们提供的)。
您可以在这篇文章中看到使用基本身份验证的身份验证过滤器示例。
推荐阅读
- c++ - 为什么基类的成员不保留它在构造函数中首次初始化的值?
- javascript - 意外的标记 '*' 在函数的参数列表之前需要一个开头的 '('
- javascript - 无法使用 Selenium Python 更改表中的选择项
- sql-server - SQL 存储过程 - 将软件日志表与新任务表连接以创建分配
- apache-spark - 在 pyspark 数据框中加载更少的列是否有任何性能(或其他)好处?
- c# - 支持“Equals”重载和隐式运算符的 Expression.Equal 解决方案
- c# - Selenium 自动化与静态页面对象模型
- c# - 如何在不使用旧版驱动程序的情况下在 MongoDB C# 驱动程序 2.1 版中实现 CommandDocument
- c++ - 找到“\ 0”时如何停止读取管道()
- node.js - 玩笑挂在 i18n.configure()