java - 如何从 Java 中的 UserPrincipal 获取角色?

标签 java servlets servlet-filters userprincipal

我创建了一个类(命名为 CustomRequestWrapper),它正在实现 HttpServletRequestWrapper 。在 CustomRequestWrapper 类中,我正在设置用户主体。现在在我的我想从用户主体获取角色列表的代码。我尝试使用 tomcat-catalina jar 中的 GenericPrincipal 类,但我遇到了强制转换异常 CustomRequestWrapper cannot be cast to < strong>通用主体。任何人都知道如何从用户主体获取角色吗?

注意:我使用的是 Apache Tomcat 服务器

这是我的代码:

public class CustomRequestWrapper extends javax.servlet.http.HttpServletRequestWrapper {

public CustomRequestWrapper(String User,List<String> roles,HttpServletRequest request) {
    super(request);
    this.user=User;
    this.roles=roles;
    this.realRequest=request;
    headerMap = new HashMap();
}
String user;  
List<String> roles = null; 
HttpServletRequest realRequest;  
private Map headerMap;

public void addHeader(String name, String value) {
    headerMap.put(name, new String(value));
}

public Enumeration getHeaderNames() {
    HttpServletRequest request = (HttpServletRequest) getRequest();
    List list = new ArrayList();
    for (Enumeration e = request.getHeaderNames(); e.hasMoreElements();) {
        list.add(e.nextElement().toString());
    }

    for (Iterator i = headerMap.keySet().iterator(); i.hasNext();) {
        list.add(i.next());
    }
    return Collections.enumeration(list);
}

public String getHeader(String name) {
    Object value;
    if ((value = headerMap.get("" + name)) != null)
        return value.toString();
    else
        return ((HttpServletRequest) getRequest()).getHeader(name);
}
     @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() {  

        public String getName() {       
            return user;  
        }  
    };  
}  

最佳答案

从您的代码中,您将用户名和角色注入(inject)到构造函数中的 CustomRequestWrapper 中。由于您在 CustomRequestWrapper 中覆盖了 getUserPrincipal 它不再返回 tomcat GenericPrincipal 而是您的匿名类,它只知道返回您的用户名通过 getName() 给出。您应该尝试通过

返回一个 tomcat GenericPrincipal
  @Override
  public Principal getUserPrincipal()
  {
    if (this.user == null)
    {
      return realRequest.getUserPrincipal();
    }

    // return a forged GenericPrincipal
    return new GenericPrincipal(user, "", roles);
  }

或者,您可以创建一个了解角色的 Principal 的自定义实现。

只有当您在 CustomRequestWrapper 构造中成功注入(inject)您的用户及其角色时,这才会起作用。

关于java - 如何从 Java 中的 UserPrincipal 获取角色?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23911018/

相关文章:

java - 创建子对象,子构造函数不使用OOP

java - 休息 - 订单 GET 响应 xml

java - 身份验证过滤器无法正确识别身份验证

java - 用新检查的异常覆盖 Java 接口(interface)

java泛型数组列表

java - 为什么直接从 Servlet 访问 DAO 是一种不好的做法?

java - jsp session 中的类型转换错误

java - 如何在servlet中使用依赖注入(inject)?

spring - Spring DispatcherServlet 与过滤器的关系

java - WebApp 中的静态 ThreadLocal 变量 - 是否存在任何安全/性能问题?