【发布时间】:2014-07-24 21:07:13
【问题描述】:
我们正试图在 JBoss EAP 6.2 中实现这一点,但目前我们无法找到它失败的原因。
在我们的应用程序中,超级用户可以在登录应用程序后决定他们想要使用的角色。因此,首先用户将拥有一个角色,然后我们要更改它。为此,我们正在执行以下操作:
Subject sub = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");
for (Principal p : sub.getPrincipals()) {
if ("Roles".equals(p.getName())) {
SimpleGroup group = (SimpleGroup) p;
group.removeMember(new SimplePrincipal(CONSTANT_SUPER_USER));
group.addMember(new SimplePrincipal(authorizationRole));
}
}
这实际上是在更改主题中的角色。但是之后在检查授权时,我们会在服务器的日志中得到以下信息:
[org.apache.catalina.authenticator] (http-/0.0.0.0:8080-11) 我们已经缓存了主体 GenericPrincipal[userName(superuser,)] 的身份验证类型 LOGIN
如您所见,修改后仍然是旧值。 我们正在使用我们自己的扩展 SimplePrincipal 的类。检查 Faces.getRequest() 的内容,我们看到请求包含 JBossGenericPrincipal 类型的 userPrincipal,并且在其中包含我们扩展的 SimplePrincipal。检查他们两个我们发现:
JBossGenericPrincipal.roles 包含超级用户
JBossGenericPrincipal.subject.principals 包含修改后的具有新授权角色的 SimpleGroup
仅供参考,我们首先在 Wildfly 上运行它并且运行良好,但我们不得不更改为 JBoss 并发现它无法正常运行。所以我们认为它必须与这个特定的 JBoss 版本相关。
有人遇到过这个问题吗?知道为什么这可能会失败吗?我想我们需要以某种方式在 JBossGenericPrincipal.roles 中放置正确的角色,但是......如何?
感谢任何帮助。谢谢!
【问题讨论】: