我在 Glassfish 上配置了一个 jdbc-realm,我正在尝试为具有多个角色的用户实施身份验证。我正在使用 JPA 来管理数据库表、JDK 1.7、Glassfish3+ 和 EclipseLink (JPA 2.0)。
我已经可以使用基于 FORM 的身份验证成功登录,但作为登录用户,我没有分配任何已定义的角色。
我在相关类上的实体映射是
个人帐户.java:
@Entity
@Table(name="PersonAccount")
public class PersonAccount implements Serializable {
@Id
@NotNull
private String userName;
private String passwordHash;
@ManyToMany(cascade={CascadeType.PERSIST})
private Set<UserRole> userRoles = new HashSet<UserRole>();;
...
用户角色.java:
@Entity
@Table(name="UserRole")
public class UserRole extends NamedEntity implements Serializable {
@Enumerated(EnumType.ORDINAL)
private persons.util.RoleType roleType = RoleType.StudentRole;
@ManyToMany(mappedBy="userRoles", cascade=
{CascadeType.PERSIST, CascadeType.REMOVE})
private Set<PersonAccount> personAccounts = new HashSet<PersonAccount>();
...
其中基类 NamedEntity 定义了一个主键“id”和一个值“name”,而“PersonAccount”本身被分配给“Person”。
创建第一个(主管理员)帐户“admin admin”时,我的数据库内容如下所示:
PERSONACCOUNT:
.USERNAME = admin
.PASSWORDHASH = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
.PERSON_ID = 220002
PERSONACCOUNT_USERROLE:
.PERSONACCOUNTS_USERNAME admin
.USERROLES_ID = 220001
USERROLE:
.ID = 220001
.NAME = AdminRole
.ROLETYPE = 3
创建帐户后,我可以使用基于表单的身份验证登录。返回的主体名称是“admin”,但没有分配用户角色“AdminRole”、“FacultyRole”、“TeacherRole”或“StudentRole”。我可以通过尝试访问受安全保护的页面之一来验证这一点。
这里是我的应用程序和 glassfish 的配置:
网页.xml:
<login-config>
<auth-method>FORM</auth-method>
<realm-name>klops</realm-name>
<form-login-config>
<form-login-page>/login.xhtml</form-login-page>
<form-error-page>/login.xhtml?error=true</form-error-page>
</form-login-config>
</login-config>
<security-role>
<description>Administrators</description>
<role-name>AdminRole</role-name>
</security-role>
<security-role>
<description>Faculty</description>
<role-name>FacultyRole</role-name>
</security-role>
<security-role>
<description>Teachers</description>
<role-name>TeacherRole</role-name>
</security-role>
<security-role>
<description>Students</description>
<role-name>StudentRole</role-name>
</security-role>
glassfish-web.xml
<security-role-mapping>
<principal-name>admin</principal-name>
<role-name>AdminRole</role-name>
<group-name>AdminRole</group-name>
</security-role-mapping>
<security-role-mapping>
<principal-name>teacher</principal-name>
<role-name>TeacherRole</role-name>
<group-name>TeacherRole</group-name>
</security-role-mapping>
<security-role-mapping>
<role-name>StudentRole</role-name>
<group-name>StudentRole</group-name>
<principal-name>student</principal-name>
</security-role-mapping>
<security-role-mapping>
<principal-name>faculty</principal-name>
<role-name>FacultyRole</role-name>
<group-name>FacultyRole</group-name>
</security-role-mapping>
最后,领域配置:
<auth-realm name="myjdbcrealm" classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm">
<property name="jaas-context" value="jdbcRealm"></property>
<property name="password-column" value="passwordhash"></property>
<property name="assign-groups" value="AdminRole,FacultyRole,TeacherRole,StudentRole"></property>
<property name="datasource-jndi" value="jdbc/__default"></property>
<property name="user-table" value="personaccount"></property>
<property name="group-table" value="userrole"></property>
<property name="user-name-column" value="username"></property>
<property name="group-name-column" value="name"></property>
<property name="digest-algorithm" value="SHA-256"></property>
</auth-realm>
我对找到一些信息的事实感到有点困惑(我只能使用创建的帐户登录,并且只能使用正确的密码),但是当我登录时,用户上下文似乎没有任何角色。
我到处搜索并尝试了将近一天,但我在这里找不到错误。能够列出连接用户目前拥有的角色甚至会有所帮助,但似乎检查角色的唯一方法是通过使用知道其名称
FacesContext.getCurrentInstance().getExternalContext().
isUserInRole("AdminRole"));
对此问题的帮助将不胜感激:)
谢谢,
帕特里克
编辑:
我创建了一个视图 USER_ACCOUNTS,其中包含 UserRole.name 作为 UserName 和 PersonAccount_Userrole.username 作为 UserName 并相应地更改了领域映射,但我仍然得到相同的结果。如果用户名等于安全角色映射中的主体名称,则用户拥有所有 4 个角色。如果我从映射中删除主体名称,则用户在登录后根本没有任何角色。
现在表格的内容和配置是:
PERSONACCOUNT: (Table)
.USERNAME = admin
.PASSWORDHASH = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
.PERSON_ID = 220002
USER_ACCOUNTS: (View)
.USERNAME = admin
.ROLENAME = AdminRole
和
<property name="password-column" value="passwordhash"></property>
<property name="assign-groups" value="AdminRole,FacultyRole,TeacherRole,StudentRole"></property>
<property name="user-table" value="personaccount"></property>
<property name="group-table" value="user_accounts"></property>
<property name="user-name-column" value="username"></property>
<property name="group-name-column" value="rolename"></property>
<property name="digest-algorithm" value="SHA-256"></property>