我正在开发一个暴露 REST-ful 接口的 Java 服务器。对接口的调用将由用户名/密码保护,并且每个用户都将分配一个角色,基于该角色将限制对资源的访问。服务器由 Glassfish 3.1 托管。我需要实现一个独立于服务器的自定义授权/身份验证方案(各种原因)。因此,在阅读了有关该主题的大量文章后,我从未找到一篇能够完全解释如何实现该主题的文章。到目前为止,我有一个自定义过滤器类,它拦截所有请求:
public class AuthenticationFilter implements Filter {
@Override
public void init(FilterConfig config) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
String user = "SalesUser";
List<String> roles = new ArrayList<String>();
roles.add("Sales");
chain.doFilter(new UserRoleRequestWrapper(user, roles, request), response);
}
这个过滤器类使用 UserRoleRequestWrapper:
public class UserRoleRequestWrapper extends HttpServletRequestWrapper {
String user;
List<String> roles = null;
HttpServletRequest realRequest;
public UserRoleRequestWrapper(String user, List<String> roles, HttpServletRequest request) {
super(request);
this.user = user;
this.roles = roles;
this.realRequest = request;
}
@Override
public boolean isUserInRole(String role) {
if (roles == null) {
return this.realRequest.isUserInRole(role);
}
return roles.contains(role);
}
@Override
public Principal getUserPrincipal() {
if (this.user == null) {
return realRequest.getUserPrincipal();
}
// make an anonymous implementation to just return our user
return new Principal() {
@Override
public String getName() {
return user;
}
};
}
}
因此过滤器拦截了请求,我设置了一个自定义主体(将基于提供的用户名/密码)。我也可以使用 getCallerPrincipal() 从 SessionContext 获取该委托人问题是 isCallerInRole() 方法。尽管我已经为我的原则分配了角色,但似乎 isCallerInRole() 在其他地方寻找该角色。如何以独立于托管应用程序的服务器的方式以编程方式设置该角色?谢谢 :)