Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/321.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java REST实现自定义授权/身份验证_Java_Security_Rest - Fatal编程技术网

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

Java REST实现自定义授权/身份验证,java,security,rest,Java,Security,Rest,我正在开发一个Java服务器,它公开REST-ful接口。对接口的调用将通过用户名/密码进行保护,并且每个用户将分配一个角色,根据该角色,对资源的访问将受到限制。服务器由Glassfish 3.1托管。 我需要实现一个独立于服务器的自定义授权/身份验证方案(各种原因)。因此,在阅读了大量关于这个主题的文章之后,我从来没有找到一篇能够很好地解释如何实现这一点的文章。 到目前为止,我拥有的是一个自定义筛选器类,它拦截所有请求: public class AuthenticationFilter

我正在开发一个Java服务器,它公开REST-ful接口。对接口的调用将通过用户名/密码进行保护,并且每个用户将分配一个角色,根据该角色,对资源的访问将受到限制。服务器由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);
}
公共类AuthenticationFilter实现筛选器{
@凌驾
public void init(FilterConfig config)抛出ServletException{}
@凌驾
public void doFilter(ServletRequest请求、ServletResponse响应、FilterChain链)抛出IOException、ServletException{
字符串user=“SalesUser”;
列表角色=新的ArrayList();
角色。添加(“销售”);
doFilter(新的UserRoleRequestWrapper(用户、角色、请求)、响应);
}
此筛选器类使用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;
            }
        };
    }
}
公共类UserRoleRequestWrapper扩展了HttpServletRequestWrapper{
字符串用户;
列表角色=null;
HttpServletRequestRealRequest;
公共UserRoleRequestWrapper(字符串用户、列表角色、HttpServletRequest){
超级(请求);
this.user=用户;
this.roles=角色;
this.realRequest=请求;
}
@凌驾
公共布尔值isUserInRole(字符串角色){
如果(角色==null){
返回此.realRequest.isUserInRole(角色);
}
返回角色。包含(角色);
}
@凌驾
公共主体getUserPrincipal(){
if(this.user==null){
返回realRequest.getUserPrincipal();
}
//创建一个匿名实现,只返回我们的用户
返回新主体(){
@凌驾
公共字符串getName(){
返回用户;
}
};
}
}
所以过滤器拦截请求,我设置了一个自定义主体(它将基于提供的用户名/密码) 问题是isCallerInRole()方法。尽管我已为原则分配了角色,但isCallerInRole()似乎在其他地方寻找该角色。如何以独立于承载应用程序的服务器的方式通过编程设置该角色? 谢谢:)