gpt4 book ai didi

java - 跨越多个 EJB 的用户信息

转载 作者:搜寻专家 更新时间:2023-11-01 00:52:26 25 4
gpt4 key购买 nike

使用 javax.security.Principal,您可以随时通过使用 @Resource 注入(inject) EJBContext 来检索用户信息。

我想做的是添加额外的信息,这些信息将特定于我的应用程序和我的用户,作为 Principal 的一部分。我还尝试将此信息包含在 EJBContextcontextData() 中,但这仅持续 EJB 生命周期而不是多次 EJB 调用。

有没有办法扩展 Principal 以添加任何额外信息?我宁愿不使用 ThreadLocal 或修改我所有的 EJB 签名来传递此信息。

最佳答案

终于解决了这个问题。可以在 JBoss AS 中创建自定义 Principal。创建一个实现 java.security.Principal 并添加自定义属性和 getter/setter 的类就足够了。

然后,在配置登录模块(例如 DatabaseServerLoginModule)时,login-config.xml 文件中的模块选项只需添加一个 principalClass 选项:

<application-policy name="my-security-domain">
<authentication>
<login-module code="org.jboss.security.auth.spi.DatabaseServerLoginModule" flag="required">
<module-option name="principalClass">com.custom.security.MyCustomPrincipal</module-option>
...

现在的问题是,由于 JBoss 中存在的错误,对注入(inject)的 EJBContext.getCallerPrincipal() 的调用将不会返回自定义 Principal,而是返回 SimplePrincipal 的普通实例!但好消息是,这可以通过以下允许检查 EJB 容器身份验证信息的 JAAS 代码来解决:

try {
Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");
Set<Group> subjectGroups = subject.getPrincipals(Group.class);
Iterator<Group> iter = subjectGroups.iterator();
while (iter.hasNext()) {
Group group = iter.next();
String name = group.getName();
if (name.equals("CallerPrincipal")) {
Enumeration<? extends Principal> members = group.members();
if (members.hasMoreElements()) {
context = members.nextElement();
myCustomPrincipal = (MyCustomPrincipal) context;
}
}
}
} catch (PolicyContextException e) {
....
}

我将上面的代码包装在一个 POJO 中,我可以将其注入(inject)到我的 EJB 中以获取 Principal,就像 EJBContext 类所做的那样。

关于java - 跨越多个 EJB 的用户信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8262541/

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