首页 > 解决方案 > 在 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();
    }
}

还是应该在过滤器上声明?

标签: javaresttomcatglassfishjersey-2.0

解决方案


所以 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 为我们提供的)。

您可以在这篇文章中看到使用基本身份验证的身份验证过滤器示例。


推荐阅读