Java 获取登录用户(JAAS)角色的客户端应用程序
我有以下代码用于运行Java(SE)应用程序(不是在服务器上),其中的登录应该使用运行JAAS身份验证的现有JBoss服务器(我绑定到4.2.3)完成。我从一个简单的控制台应用程序开始执行登录,然后将此功能集成到应用程序中 我使用一个代码段find来执行登录:Java 获取登录用户(JAAS)角色的客户端应用程序,java,jboss,jaas,Java,Jboss,Jaas,我有以下代码用于运行Java(SE)应用程序(不是在服务器上),其中的登录应该使用运行JAAS身份验证的现有JBoss服务器(我绑定到4.2.3)完成。我从一个简单的控制台应用程序开始执行登录,然后将此功能集成到应用程序中 我使用一个代码段find来执行登录: JaasJbossConfiguration.activateConfiguration(); UsernamePasswordHandler handler = new UsernamePasswordHandler("userNa
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的例子
- 在application-users.properties和applications-roles.properties中添加用户和角色(有关命令行界面,请参阅Jboss的文档)
- 如果您正在使用EJB,您甚至可以使用@RolesAllowed、@PermitAll、@DenyAll等在粒度级别(如EJB方法级别)进行授权
您的应用程序是什么类型的(命令行应用程序)?它对JBoss(EJB)有什么要求?我编辑了我的问题,使之更清楚。所以,是的,目前它只是一个命令行应用程序。首先,我们不需要会话处理,只需授予用户访问权限即可。因此,没有必要调用EJB并使用用户的登录会话——如果你是说“它在JBOSS(EJB)上调用了什么?”如果你没有调用EJB,那么(登录后)你在JBOSS上还做了什么?您使用的是哪个JBoss登录模块?稍后我们想调用一些服务、MBean等,但现在我们只想将本地登录模块与基于服务器的模块交换。我使用ClientLoginModule。