我正在开发一个暴露REST-ful接口的Java服务器。对接口的调用将通过用户名/密码进行保护,并且每个用户都将分配一个角色,根据该角色限制对资源的访问。该服务器由Glassfish 3.1托管。 我需要实现独立于服务器的自定义授权/身份验证方案(各种原因)。因此,在阅读了关于该主题的大量文章之后,我从未找到一个能够解释如何实现该文章的文章。 到目前为止我所拥有的是一个拦截所有请求的自定义Filter类:
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;
}
};
}
}
所以过滤器拦截了请求,我设置了一个自定义Principal(它将基于提供的用户名/密码)。我也可以使用getCallerPrincipal()从SessionContext获取该主体 问题是isCallerInRole()方法。尽管我已经为我的原则分配了角色,但似乎isCallerInRole()看起来在角色的其他地方。如何以与托管应用程序的服务器无关的方式以编程方式设置该角色? 谢谢:))