我正在使用Jbos AS 5和DatabaseServerLoginModule进行授权。我将我的应用程序策略定义为(仅作为示例,而不是实际代码):
<application-policy name = "jbossmq">
<authentication>
<login-module code = "org.jboss.security.auth.spi.DatabaseServerLoginModule"
flag = "required">
<module-option name = "unauthenticatedIdentity">guest</module-option>
<module-option name = "dsJndiName">java:/MyDatabaseDS</module-option>
<module-option name = "principalsQuery">SELECT PASSWD FROM JMS_USERS WHERE USERID=?</module-option>
<module-option name = "rolesQuery">SELECT ROLEID, 'Roles' FROM JMS_ROLES WHERE USERID=?</module-option>
</login-module>
</authentication>
</application-policy>
成功授权用户后,如何从servlet中检索用户角色?在上面的代码片段中,角色是从数据库中选择的,但它们存储在哪里?在会议中!?如果是,在哪个会话变量下?
此外,是否可以在JBoss中结合使用Ldap身份验证和数据库授权?
答案 0 :(得分:4)
boolean HttpServletRequest.isUserInRole(String role)
方法可用于检查用户是否分配了某个角色。 但是,此方法旨在检查应用程序定义的J2EE角色(在EAR的描述符中,application.xml)。
在部署期间,或者通过在EAR文件中打包特定于AS的描述符,您需要指定应用程序服务器的用户角色(您在登录模块中设置为主体)的映射到J2EE应用程序。角色。
答案 1 :(得分:2)
我知道这个方法:
boolean HttpServletRequest.isUserInRole(String role)
我知道这并没有给你一份所有角色的清单,但它能满足你的目的吗?
答案 2 :(得分:1)
如果容器兼容JACC,则以下代码段可能有效(至少对我来说是Glassfish 3.1.x)
Subject subject = (Subject) PolicyContext.getContext("javax.security.auth.Subject.container");
for (Principal principal : subject.getPrincipals()) {
LOG.debug("In subject: " + principal.getName());
}
第一个匹配(通常)是您的用户主体,其他人往往是组主体。请注意,如果您碰巧知道小组校长班级名称,可以通过拨打getPrincipals(Class<T> c)
来过滤它。