客户委托人赢得';不能在Jboss上传播到EJB SessionContext

客户委托人赢得';不能在Jboss上传播到EJB SessionContext,jboss,ejb,Jboss,Ejb,在EJB项目中,我需要替换“javax.EJB.SessionContext”中的调用原则名称。我使用Jboss AS 6.0 Final作为应用服务器 我定义了一个自定义UserLoginModule,它扩展了UsernamePasswordLoginModule并添加了一个自定义主体,但我的自定义主体不会传播到EJB SessionContext 以下是我的自定义登录模块中的一些代码: @Override protected Group[] getRoleSets() throws Logi

在EJB项目中,我需要替换“javax.EJB.SessionContext”中的调用原则名称。我使用Jboss AS 6.0 Final作为应用服务器

我定义了一个自定义UserLoginModule,它扩展了UsernamePasswordLoginModule并添加了一个自定义主体,但我的自定义主体不会传播到EJB SessionContext

以下是我的自定义登录模块中的一些代码:

@Override
protected Group[] getRoleSets() throws LoginException {

    Group[] groups = new Group[2];
    groups[0] = new SimpleGroup("Roles");
    groups[0].addMember(createRoleIdentity());

    Group callerPrincipal = new SimpleGroup("CallerPrincipal");
    callerPrincipal.addMember(createIdentity(this.getUsername()));
    groups[1] = callerPrincipal;
    subject.getPrincipals().add(callerPrincipal);

    return groups;
}

@Override
protected Principal createIdentity(String username) throws LoginException {
    return new MyCustomPrincipal(username);
}

}
我的自定义登录模块工作得很好,但我从“javax.ejb.SessionContext”获得的调用方主体仍然是SimplePrincipal

原来有一个作业错误:EJBContext.getCallerPrincipal()没有返回自定义主体

以及相关主题:


我想知道您是否对此有一些经验,替换Jboss创建的默认主体安全吗?有副作用吗

在我的团队的帮助下,我找到了一个解决方案,希望这能对那些有同样问题的人有所帮助

而不是“sessionContext.getCallerPrincipal()” 使用以下命令获取自定义主体:

        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()) {

                               Principal principal = (Principal) members.nextElement();
                               return principal;

                        }
                    }
                }
            }
        } catch (PolicyContextException e1) {
            ...
        } 
试试看{
Subject Subject=(Subject)PolicyContext.getContext(“javax.security.auth.Subject.container”);
Set subjectGroups=subject.getPrincipals(Group.class);
迭代器iter=subjectGroups.Iterator();
while(iter.hasNext()){
组=iter.next();
字符串名称=group.getName();
if(name.equals(“CallerPrincipal”)){

枚举在JBoss7中,这似乎仍然是一个问题