Java 获取登录用户(JAAS)角色的客户端应用程序

Java 获取登录用户(JAAS)角色的客户端应用程序,java,jboss,jaas,Java,Jboss,Jaas,我有以下代码用于运行Java(SE)应用程序(不是在服务器上),其中的登录应该使用运行JAAS身份验证的现有JBoss服务器(我绑定到4.2.3)完成。我从一个简单的控制台应用程序开始执行登录,然后将此功能集成到应用程序中 我使用一个代码段find来执行登录: JaasJbossConfiguration.activateConfiguration(); UsernamePasswordHandler handler = new UsernamePasswordHandler("userNa

我有以下代码用于运行Java(SE)应用程序(不是在服务器上),其中的登录应该使用运行JAAS身份验证的现有JBoss服务器(我绑定到4.2.3)完成。我从一个简单的控制台应用程序开始执行登录,然后将此功能集成到应用程序中

我使用一个代码段find来执行登录:

JaasJbossConfiguration.activateConfiguration();
UsernamePasswordHandler handler =
  new UsernamePasswordHandler("userName", "passWord");
LoginContext lc = new LoginContext("myrealm", handler);
try {
     lc.login();
} catch (LoginException e) {
 // Authentication failed.
}
这很有魅力。现在我想扩展我的应用程序,只允许具有特殊角色的用户访问。有没有办法从Java应用程序端获取用户角色,或者只允许对这些用户进行身份验证?

  • 如果(自定义)登录模块检查身份验证,则可以阻止基于(不存在)角色的身份验证
  • 但通常情况下,如果有一个用户具有匹配的密码,则该用户经过身份验证(可能根本没有角色)。因此,通常身份验证(用户/密码)与授权(角色)不关联

  • 在EJB中,您可以基于角色使用声明式授权(请参见
    @RolesAllowed
  • 对于EJB:您可以在EJB中调用
    EJBContext.getCallerPrincipal()
    EJBContext.isUserInRole()
  • 至于servlet/JSP:您可以调用
    HttpServletRequest.getRemoteUser()
    HttpServletRequest.isUserInRole()
  • 至于独立应用程序,我不知道有API
  • 因此,标准API只允许检查角色。如果您想获得角色列表,则没有官方API

无论如何,请查看登录模块的源代码(例如:
DatabaseServerLoginModule
)。然后编写一个EJB,它执行相同的操作(关于角色查找),并将角色列表返回到独立应用程序。

按照以下步骤使用容器(主要是JAA)提供的JEE安全性。其优点是,您只需配置即可将身份验证和授权更改为任何新技术,而不会影响应用程序的其他部分。我举了一个使用JBoss的例子

  • 在web.xml中添加安全约束

    网络资源 /* 角色添加更新 角色搜索 角色管理 角色管理 角色添加更新 角色搜索

  • 在Jboss-web.xml中添加Jboss安全域名

    java:/jaas/other 真的

    • 在application-users.properties和applications-roles.properties中添加用户和角色(有关命令行界面,请参阅Jboss的文档)
    • 如果您正在使用EJB,您甚至可以使用@RolesAllowed、@PermitAll、@DenyAll等在粒度级别(如EJB方法级别)进行授权

  • 您的应用程序是什么类型的(命令行应用程序)?它对JBoss(EJB)有什么要求?我编辑了我的问题,使之更清楚。所以,是的,目前它只是一个命令行应用程序。首先,我们不需要会话处理,只需授予用户访问权限即可。因此,没有必要调用EJB并使用用户的登录会话——如果你是说“它在JBOSS(EJB)上调用了什么?”如果你没有调用EJB,那么(登录后)你在JBOSS上还做了什么?您使用的是哪个JBoss登录模块?稍后我们想调用一些服务、MBean等,但现在我们只想将本地登录模块与基于服务器的模块交换。我使用ClientLoginModule。