我使用jboss作为7.1.1.Final并使用LdapExtLoginModule配置了安全域。登录工作到目前为止。
我现在想要访问SLSB中模块加载的角色。我知道如何访问用户名。我的示例使用ejb 3.1并将用户名输出到System.out。
我不知道如何访问角色,也没有在文档中找到任何内容。 EJBContext提供了方法isCallerInRole(String),它证明了上下文本身知道角色,但我找不到返回一组角色的方法。
我知道我可以编写一个自定义的LoginModule,它扩展了LdapExtLoginModule并设置了包含角色的自定义主体。但也许使用现有功能有一种更简单的方法。有人知道这种方法吗?
SLSB代码:
@Stateless
@Remote(IAService.class)
public class AService implements IAService
{
@Resource
private EJBContext context;
@Override
public void printUserData() {
System.out.println("Name: " + context.getCallerPrincipal().getName());
// TODO print roles
}
}
答案 0 :(得分:4)
到目前为止,没有人回答我的问题,因为我终于找到了一个有效的解决方案,现在我将与您分享:
Java EE API不提供任何以独立于服务器的方式访问信息的方法。所以我尝试了编写一个设置自定义主体的登录模块的方法。 As it turns out this does not work either
受到这个问题答案的启发,我现在使用以下代码来获取调用者角色:
private Group getRoles() {
final Subject subject = (Subject)PolicyContext.getContext("javax.security.auth.Subject.container");
final Set<Group> groups = subject.getPrincipals(Group.class);
for (final Group group : groups) {
if ("Roles".equals(group.getName())) {
return group;
}
}
throw new IllegalStateException("No roles group found");
}
此方法返回的Group包含Principals,其中包含用户组的名称。这仅适用于JBoss,其LoginModules设置名为“Roles”的组。