如何在Servlet中获取用户角色?

时间:2009-05-07 12:31:54

标签: java authentication jboss

我正在使用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身份验证和数据库授权?

3 个答案:

答案 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)来过滤它。