Java 如何在代码中的任意点访问JAAS角色?

Java 如何在代码中的任意点访问JAAS角色?,java,security,jaas,role,security-roles,Java,Security,Jaas,Role,Security Roles,我想访问我的SOAP应用程序中具有角色的完整用户模型。例如,我可能想知道名为“Fred”的用户的角色 如何进入某种全局JAAS注册表并执行(伪代码)globalRegistry.getUser(“Fred”).getPrinciples()?(请注意,在JAAS中,角色由主体表示。) 我知道如何从LoginContext中获取主题的主体,但这有两个问题 这只是在登录时,我不希望对前面提到的注册表进行编码,而是自己存储Subject和Principal对象,因为它们已经由appserver存储 最

我想访问我的SOAP应用程序中具有角色的完整用户模型。例如,我可能想知道名为“Fred”的用户的角色

如何进入某种全局JAAS注册表并执行(伪代码)globalRegistry.getUser(“Fred”).getPrinciples()?(请注意,在JAAS中,角色由主体表示。)

我知道如何从LoginContext中获取主题的主体,但这有两个问题

  • 这只是在登录时,我不希望对前面提到的注册表进行编码,而是自己存储Subject和Principal对象,因为它们已经由appserver存储
  • 最好是,即使Fred不是当前用户,我也希望能够访问此信息

  • 我正在使用Jetty,但我认为这些行为是JAAS的标准行为。

    对我来说,这似乎使appsever的用户、组等与J2EE应用程序角色结合起来

    • 获取特定用户的权限是一项管理任务,通常必须使用特定于appserver的API来完成
    • JAAS编程模型在更高的抽象层次上工作。它仅提供用户是否处于J2EE角色(在应用程序中定义)的信息

    我们使用一个ThreadLocal变量来引用当前用户,因为该用户已经在系统入口点(在我们的例子中是servlet或ejb)进行了身份验证。这允许对当前用户进行“全局”访问。这与JAAS或任何其他安全协议没有直接联系,但可以从它们进行初始化

    编辑:来自ThreadLocal的返回是当前用户的主题


    访问其他用户通常会通过某种类型的管理模块来完成。

    我认为JAAS的设计目的是不允许您真正尝试做的事情。我知道,在我构建的应用程序中,我需要那种功能,我必须绕过step JAAS,直接编程到实际的身份存储库中,无论是LDAP、ActiveDirectory还是其他什么。我看到的一种模式是:

    AccessControlContext acc = AccessController.getContext();
    Subject subject = Subject.getSubject(acc);
    Set<Principal> principals = subject.getPrincipals();
    
    AccessControlContext acc=AccessController.getContext();
    Subject-Subject=Subject.getSubject(acc);
    Set principals=subject.getPrincipals();
    
    本质上,这会找到当前与当前线程关联的主题,并请求其主体

    这一用法的一个例子是在。它位于
    扩展身份验证
    方法中,该方法的工作是确定当前线程在创建新会话时拥有的Jackrabbit权限(我认为)

    然而,我应该注意到,至少在J2EE上下文中,这可能并不一定真正起作用。我在JBossAS7下使用这段代码,但找不到主题。不过,这可能只是一个bug。

    在EJB使用中

    @Resource(mappedName = "java:comp/EJBContext")
    protected SessionContext sessionContext;
    
    并在任何时候尝试使用
    context.lookup(“java:comp/EJBContext”


    这段代码适用于JBoss服务器系列,其他人可以在JNDI中找到它