Java REST实现自定义授权/身份验证

时间:2012-11-27 13:27:13

标签: java security rest

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

0 个答案:

没有答案