Authentication 登录Glassfish JDBC领域后缺少用户角色

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

我在Glassfish上配置了一个jdbc领域,我正在尝试为具有多个角色的用户实现身份验证。我使用JPA来管理数据库表、JDK1.7、Glassfish3+和EclipseLink(JPA2.0)

我已经可以使用基于表单的身份验证成功登录,但作为登录用户,我没有分配任何已定义的角色

我在相关类上的实体映射是

PersonAccount.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>();;

...
@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”。但我得到了同样的结果。可以登录。如果用户名等于主体名称,则用户拥有所有四个角色。如果我从中删除定义,则用户在登录后没有角色。您能否确认域中的任何内容都正常工作?具体来说,它拒绝未知用户和错误密码?是的,一切似乎都很好。不正确的密码将被拒绝,未知用户将被拒绝。登录时,将显示