我需要在 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/