Authentication 登录Glassfish JDBC领域后缺少用户角色
我在Glassfish上配置了一个jdbc领域,我正在尝试为具有多个角色的用户实现身份验证。我使用JPA来管理数据库表、JDK1.7、Glassfish3+和EclipseLink(JPA2.0) 我已经可以使用基于表单的身份验证成功登录,但作为登录用户,我没有分配任何已定义的角色 我在相关类上的实体映射是 PersonAccount.java:Authentication 登录Glassfish JDBC领域后缺少用户角色,authentication,jakarta-ee,jdbc,glassfish,jdbcrealm,Authentication,Jakarta Ee,Jdbc,Glassfish,Jdbcrealm,我在Glassfish上配置了一个jdbc领域,我正在尝试为具有多个角色的用户实现身份验证。我使用JPA来管理数据库表、JDK1.7、Glassfish3+和EclipseLink(JPA2.0) 我已经可以使用基于表单的身份验证成功登录,但作为登录用户,我没有分配任何已定义的角色 我在相关类上的实体映射是 PersonAccount.java: @Entity @Table(name="PersonAccount") public class PersonAccount implements
@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>();;
...
@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>();
...
<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>
创建帐户后,我可以使用基于表单的身份验证登录。返回的主体名称为“admin”,但未分配任何用户角色“AdminRole”、“FacultyRole”、“TeacherRole”或“StudentRole”。我可以通过尝试访问一个受安全保护的页面来验证这一点
下面是我的应用程序和glassfish的配置:
web.xml:
@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>();;
...
@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>();
...
<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>
在此问题上的帮助将不胜感激:)
谢谢
帕特里克
编辑:
@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>();;
...
@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>();
...
<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>
我创建了一个视图USER\u ACCOUNTS,其中包含UserRole.name作为用户名和PersonAccount\u UserRole.UserName作为用户名,并相应地更改了领域映射,但仍然得到相同的结果。
如果用户名等于安全角色映射中的主体名称,则该用户拥有所有4个角色。如果我从映射中删除主体名称,则用户在登录后根本没有角色
现在,表的内容和配置如下:
PERSONACCOUNT: (Table)
.USERNAME = admin
.PASSWORDHASH = 8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918
.PERSON_ID = 220002
USER_ACCOUNTS: (View)
.USERNAME = admin
.ROLENAME = AdminRole
及
考虑到您的
auth realm
定义(我假设该定义目前有效),我希望看到两个表(最少信息类似于):
请注意,username
列在两个表中具有相同的(列)名称
我看到你们有三张桌子:
PERSONACCOUNT
PERSONACCOUNT_USERROLE
USERROLE
如果要保留该结构,请创建一个视图
,将PERSONACCOUNT\u USERROLE
和USERROLE
表映射到类似上面所示的组表中,并将该视图设置为您的组表
我可以证实,这种基于视图的策略适用于GlassFish3.1.X和MySQL;它可能无法移植到其他应用服务器
不确定您的
安全角色映射(包括主体名称)想要实现什么,除了可能尝试解决JDBC领域缺少的角色之外
同样,realm属性assign groups
的目的是建立一组始终为所有用户定义的组。我从你后来的评论中得知,这种行为是出人意料的;这显然就是原因。考虑到您的auth realm
定义(我假设它目前是有效的),我希望看到两个表(最小信息类似于):
请注意,username
列在两个表中具有相同的(列)名称
我看到你们有三张桌子:
PERSONACCOUNT
PERSONACCOUNT_USERROLE
USERROLE
如果要保留该结构,请创建一个视图
,将PERSONACCOUNT\u USERROLE
和USERROLE
表映射到类似上面所示的组表中,并将该视图设置为您的组表
我可以证实,这种基于视图的策略适用于GlassFish3.1.X和MySQL;它可能无法移植到其他应用服务器
不确定您的安全角色映射(包括主体名称)想要实现什么,除了可能尝试解决JDBC领域缺少的角色之外
同样,realm属性assign groups
的目的是建立一组始终为所有用户定义的组。我从你后来的评论中得知,这种行为是出人意料的;这显然就是原因。我使用了这三个表,因为这是教程中所做的,所以我认为它应该有效。但现在,我创建了一个视图“User\u Account”,其中包含来自表userrole的“RoleName”和来自personaccount\u userrole的“UserName”。但我得到了同样的结果。可以登录。如果用户名等于主体名称,则用户拥有所有四个角色。如果我从中删除定义,则用户在登录后没有角色。您能否确认域中的任何内容都正常工作?具体来说,它拒绝未知用户和错误密码?是的,一切似乎都很好。不正确的密码将被拒绝,未知用户将被拒绝。登录时,getRemoteUser()返回正确的用户名。当使用指定的主体名称“admin”登录时,用户拥有所有角色,我可以访问所有受安全保护的页面。如果我删除主体名称,则用户没有角色,他无法访问它们(错误403)。因此,角色映射似乎是唯一不起作用的地方。@PatrickGeib update与assign-groups-realm属性的使用有关;你可能想放弃那个财产。它很有效!!!没有分配组,使用指定的主体名称,并且在重新启动服务器后,现在可以工作了!我仍然不知道确切的原因,但我最终会找到答案。几天前才开始使用JavaEE xD非常感谢Richard,你是个救命恩人:)如果我达到15次代表分数,我会给你“有用的”-这一次也会升级:)我使用了三个表,因为这是教程中所做的,所以我认为它应该有效。但现在,我创建了一个视图“User\u Account”,其中包含来自表userrole的“RoleName”和来自personaccount\u userrole的“UserName”。但我得到了同样的结果。可以登录。如果用户名等于主体名称,则用户拥有所有四个角色。如果我从中删除定义,则用户在登录后没有角色。您能否确认域中的任何内容都正常工作?具体来说,它拒绝未知用户和错误密码?是的,一切似乎都很好。不正确的密码将被拒绝,未知用户将被拒绝。登录时,将显示