【问题标题】:How to get Roles from UserPrincipal in Java?如何从 Java 中的 UserPrincipal 获取角色?
【发布时间】:2014-05-28 11:58:44
【问题描述】:

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

注意:我使用的是 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;  
        }  
    };  
}  

}

【问题讨论】:

  • 您是否正在尝试获取经过 tomcat 身份验证的用户的角色,即在 tomcat-users.xml 中声明的角色?
  • 否。我正在尝试为我的应用验证用户获取角色
  • 好的,你可以给你看看代码CustomRequestWrapper 吗?
  • 请检查一下,我上传了我的代码

标签: java servlets servlet-filters userprincipal


【解决方案1】:

从您的代码中,您将用户名和角色注入到构造函数中的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 构造中成功注入您的用户及其角色时,这才有效。

【讨论】:

  • 它对我来说很好。我非常抱歉我没有资格投票,否则我可以投票给你
【解决方案2】:

你提到的异常可能是解决你问题的关键

CustomRequestWrapper cannot be cast to GenericPrincipal

您必须转换 Principal 对象而不是 CustomRequestWrapper。这是一个示例方法,您可以在 CustomRequestWrapper 类下添加它,它应该返回 Tomcat AS 下的用户角色列表。 (我认为这是一个混乱的方法):

private String[] getRolePrincipal() {
  final GenericPrincipal genericPrincipal = (GenericPrincipal) getUserPrincipal();
  return genericPrincipal.getRoles();
}

所以最终的CustomRequestWrapper会如下:

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;
      }
    };
  }

  public String[] getRolePrincipal() {
    final GenericPrincipal genericPrincipal = (GenericPrincipal) getUserPrincipal();
    return genericPrincipal.getRoles();
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-29
    • 2019-11-02
    • 1970-01-01
    相关资源
    最近更新 更多