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

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

我一辈子都无法弄清楚如何将所有这些联系在一起。

我真的不想走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中,

然后,您可以使用您的角色特权身份验证逻辑来​​处理请求。

09-16 03:50