3

我正在开发一个暴露 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() 在其他地方寻找该角色。如何以独立于托管应用程序的服务器的方式以编程方式设置该角色?谢谢 :)

4

0 回答 0