代码之家  ›  专栏  ›  技术社区  ›  jr. Aikon Mogwai

Jersey、Tomcat和安全注释

  •  10
  • jr. Aikon Mogwai  · 技术社区  · 15 年前

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

    现在,为了获得授权,我希望能够使用JSR 250注释,比如 @RolesAllowed , @PermitAll , @DenyAll 等等。

    我一辈子都不知道怎么把这一切联系起来。

    我真的不想走春保路线,因为我现在需要一些非常简单的东西。

    有人能告诉我正确的方向吗?

    1 回复  |  直到 11 年前
        1
  •  1
  •   user    6 年前

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

    对于权限管理,可以实现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中,

    然后可以使用角色权限验证逻辑处理请求。