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