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

时间:2013-08-19 14:56:28

标签: java jboss jaas

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

我使用一个代码段 - 找到here - 来执行登录:

JaasJbossConfiguration.activateConfiguration();
UsernamePasswordHandler handler =
  new UsernamePasswordHandler("userName", "passWord");
LoginContext lc = new LoginContext("myrealm", handler);
try {
     lc.login();
} catch (LoginException e) {
 // Authentication failed.
}

这就像一个魅力。现在我想扩展我的应用程序并仅允许特殊角色的用户访问。有没有办法从Java应用程序端获取用户角色或仅允许那些用户进行身份验证?

2 个答案:

答案 0 :(得分:2)

  • 如果(自定义)登录模块检查它,您可以阻止基于(不存在的)角色的身份验证。
  • 但通常情况下,如果用户具有匹配的密码,则会对用户进行身份验证(可能根本没有任何角色)。因此,身份验证(用户/密码)通常与授权(角色)无关。

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

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

答案 1 :(得分:0)

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

  1. 在web.xml中添加安全性约束

                 网络资源         / *                   ROLE_ADDUPDATE         ROLE_SEARCH         ROLE_ADMIN          ROLE_ADMIN     ROLE_ADDUPDATE     ROLE_SEARCH

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

         Java的:/ JAAS /其他      真正         

    • 在application-users.properties和applications-roles.properties中添加用户和角色(请参阅Jboss for Document Line Interface的documentatin)
    • 如果您使用的是EJB,您甚至可以使用@RolesAllowed,@ PermitAll,@ DenyAll等在EJB方法级别进行粒度级别授权