tomcat - Jersey、Tomcat 和安全注解

标签 tomcat annotations jersey

我需要在 Tomcat 6.0.24 容器中保护一个简单的 Jersey RESTful API。我想使用 tomcat-users.xml 文件来定义用户和角色,以使用基本身份验证来保持身份验证(这是暂时的,就像我说的一样小)。

现在,对于授权,我希望能够使用像 @RolesAllowed@PermitAll@DenyAll 这样的 JSR 250 注释等

我这辈子都想不出如何将它们连接起来。

我真的不想走 Spring Security 路线,因为目前我需要一些非常简单的东西。

有人能指出我正确的方向吗?

最佳答案

您可以先从使用涵盖身份验证和权限管理的过滤器开始。 通过实现 ResourceFilter 和 ContainerRequestFilter,您能够获取 httpRequest,然后 session 将您的应用程序/请求重定向到相关方法。

对于权限管理,您可以实现 SecurityContext 过滤器。您必须首先检查 isUserInRole 才能让请求进入方法。

这是 SecurityContext 实现的示例:

 public class SecurityContextImpl implements SecurityContext {

    private final SessionUser user;

    public SecurityContextImpl(SessionUser user) {
        this.user = user;
    }

    public Principal getUserPrincipal() {
        return user;
    }

    public boolean isUserInRole(String role) {

        if(user == null) {
            throw new AuthenticationException();
        }
        if(ObjectUtil.isNull(user.getPrivileges())){
            throw new AuthenticationException();
        }
        if(!user.getPrivileges().contains(role)) {
            throw new InvalidAuthorizationHeaderException();
        }
        return user.getPrivileges().contains(role);
    }

    public boolean isSecure() {
        return false;
    }

    public String getAuthenticationScheme() {
        return SecurityContext.BASIC_AUTH;
    }
}

这是基本的 SecurityContextFilter 实现:

    public class SecurityContextFilter implements ResourceFilter, ContainerRequestFilter {

    private static final Logger LOG = LoggerFactory.getLogger(SecurityContextFilter.class);

    protected static final String HEADER_AUTHORIZATION = "Authorization";

    protected static final String HEADER_DATE = "x-java-rest-date";

    protected static final String HEADER_NONCE = "nonce";


    private HttpServletRequest httpRequest;




    public SecurityContextFilter() {


    }


    public ContainerRequest filter(ContainerRequest request) {

        SessionUser sessionUser = (SessionUser) httpRequest
                .getSession()
                .getAttribute("sessionUser");

        request.setSecurityContext(new SecurityContextImpl(sessionUser));

        return request;
    }


    public ContainerRequestFilter getRequestFilter() {
        return this;
    }

    public ContainerResponseFilter getResponseFilter() {
        return null;
    }

    public HttpServletRequest getHttpRequest() {
        return httpRequest;
    }

    public void setHttpRequest(HttpServletRequest httpRequest) {
        this.httpRequest = httpRequest;
    }


}

不要忘记将过滤器作为 init-param 放入 web.xml 中,

然后您可以使用您的角色-权限-身份验证逻辑处理请求。

关于tomcat - Jersey、Tomcat 和安全注解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2291323/

相关文章:

java - 在Java中解析 application/json Jersey @Consumes MIME 类型的最佳方法是什么?

java - Java 中的 cometd HTTP 模式

java - Spring 应用程序无法使用 jndi 和正在运行的 Tomcat 7 服务器创建 DataSource bean

java - : Unable to start web server; nested exception is org. springframework.boot.web.server.WebServerException:无法启动嵌入式Tomcat

java - java注释如何与spring一起工作,它们是在运行时还是在启动时扫描的?

java - 如何在 Rest 服务中发送带有 Jersey 的 JSON 对象

java - 如何访问 Jersey 组件中的 Mule Message 属性

java - Tomcat Web 应用程序中与 Java 和 MySQL 的连接池

java - Java 注释的最佳(或至少是好的)指南

java - 为什么@Deprecated 在这里不起作用?