gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:13:50 35 4
gpt4 key购买 nike

我创建了一个类(命名为 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/

35 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com