Glassfish 3安全性 – 使用JDBC Realm进行基于表单的身份validation

我想通过glassfishV3了解基于表单的安全性和JDBC领域,所以我决定创建一个允许登录和退出的小应用程序,我按照本书中的说明进行操作。

我理解保持的东西是如何工作的,但是有些东西是错的,我无法让它正常工作。

我首先做的是用JPA注释创建一个小数据库:

@Entity @Table(name="USERS") public class User implements Serializable { private static final long serialVersionUID = -1244856316278032177L; @Id @GeneratedValue @Column(nullable = false) private Long id; @Column(nullable = false) private String email; @Column(nullable = false) private String password; @OneToMany(mappedBy = "user") private List groups; //GET & SET METHODS... } 

这是另一个包含每个用户角色的表

 @Entity @Table(name="GROUPS") public class Group implements Serializable { private static final long serialVersionUID = -7274308564659753174L; @Id @GeneratedValue @Column(nullable = false) private Long id; @Column(nullable = false) private String groupName; @ManyToOne @JoinColumn(name = "USERS_ID", nullable = false) private User user; //GET & SET METHODS... } 

当数据库准备就绪时,我手动添加了一些数据

在此处输入图像描述

下一步是配置安全领域。

在此处输入图像描述

然后将安全配置添加到我的web.xml文件中

   CHAPTER x 12 Container Managed Authentication and Authorization  index.xhtml   Faces Servlet javax.faces.webapp.FacesServlet 1   Faces Servlet *.xhtml    VISITOR PERMISIONS /index.xhtml /visitorpanel.xhtml GET POST   visitors users administrators     USERS PERMISIONS /userpanel.xhtml /index.xhtml /visitorpanel.xhtml GET POST   users administrators     ADMIN PERMISIONS /adminpanel.xhtml /userpanel.xhtml /index.xhtml /visitorpanel.xhtml GET POST   administrators    FORM DBRealm  /index.xhtml /error.xhtml    visitors   users   administrators   

我的目标是:

  • 管理员可以查看所有页面

  • 访问者只能看到index.xhtml和visitorpanel.xhtml

  • 用户可以看到index.xhtml,visitorpanel.xhtml和userpanel.xhtml

我认为配置是正确的。

最后一步是在index.xhtml页面中创建登录表单:

 


程序构建正常,但我有以下问题:

1-当我尝试以用户或管理员身份登录时(访问者不需要登录),我被重定向到error.xhtml页面,在控制台中我看到一个exception:

严重:SEC1112:无法validationJDBC领域的用户[admin@gmail.com]。 警告:Web登录失败:登录失败:javax.security.auth.login.LoginException:安全exception警告:PWC4011:无法从上下文/ CHAPTER_12_x_Container_Managed_Authentication_and_Authorization将请求字符编码设置为UTF-8,因为请求参数已被读取,或者ServletRequest .getReader()已被调用

2-当我尝试通过URL导航到某些页面时,没有任何反应。 我认为没关系,但是当我尝试访问visitorpanel.xhtml时,它应该让我,因为没有必要登录才能看到它。 如果希望每个人都能看到它,我是否需要从安全配置中删除该页面?

3-此外,我很好奇为什么我不能使用标签h:form而不仅仅是表单,当我实现登录时?

我非常感谢一些帮助,我已经花了几个小时阅读本书的第一章并尝试实施,我自己的例子,但我卡住了。 我想我接近解决方案。

更新

我将Default主体更改为访问者用户名。 但它仍然无效

在此处输入图像描述

我还为我的Realm配置添加了一些选项

在此处输入图像描述

但是当我尝试登录时,我仍然看到一个例外情况:

严重:SEC1112:无法validationJDBC领域的用户[admin@gmail.com]。 警告:Web登录失败:登录失败:javax.security.auth.login.LoginException:安全exception警告:PWC4011:无法从上下文/ CHAPTER_12_x_Container_Managed_Authentication_and_Authorization将请求字符编码设置为UTF-8,因为请求参数已被读取,或者ServletRequest .getReader()已被调用

我还是不知道遗失了什么。

– 表名不应该是大写的吗?

– 列名不应该是大写的吗?

– 表格创建错误吗?

– 我不能使用PASSWORD作为列名,因为它会产生某种冲突吗?

我真的不明白为什么那个例外。 我从管理面板中ping了数据库,一切似乎都是正确的。

有人可以帮我解决这个问题吗?

更新2

我将’javax.enterprise.system.core.security’日志记录选项更改为级别FINE,以便在发生exception时获得更多信息,这是我尝试登录时的结果:

FINE:Intercept Entry:intercept:SOAP defaultServerID:null defaultClientID:null FINE:ID Entry:module class:com.sun.xml.wss.provider.ClientSecurityAuthModule id:XWS_ClientProvider type:client request policy:javax.security.auth.message。 MessagePolicy @ e95a72响应策略:javax.security.auth.message.MessagePolicy@310a6d选项:{signature.key.alias = s1as,debug = false,dynamic.username.password = false,encryption.key.alias = s1as}精细: ID条目:模块类:com.sun.xml.wss.provider.ClientSecurityAuthModule id:ClientProvider类型:客户端请求策略:javax.security.auth.message.MessagePolicy@1829770响应策略:javax.security.auth.message.MessagePolicy @ a4461e选项:{signature.key.alias = s1as,debug = false,dynamic.username.password = false,encryption.key.alias = s1as,security.config = C:\ jeeAplicationServer \ glassfishv3 \ glassfish \ domains \ domain1 / config /wss-server-config-1.0.xml} FINE:ID条目:模块类:com.sun.xml.wss.provider.ServerSecurityAuthModule id:XWS_ServerPro vider类型:服务器请求策略:javax.security.auth.message.MessagePolicy@f79c86响应策略:javax.security.auth.message.MessagePolicy@454bf7选项:{signature.key.alias = s1as,debug = false,encryption.key .alias = s1as} FINE:ID Entry:module class:com.sun.xml.wss.provider.ServerSecurityAuthModule id:ServerProvider type:server request policy:javax.security.auth.message.MessagePolicy@17e85e4 response policy:javax.security .auth.message.MessagePolicy @ 1887906选项:{signature.key.alias = s1as,debug = false,encryption.key.alias = s1as,security.config = C:\ jeeAplicationServer \ glassfishv3 \ glassfish \ domains \ domain1 / config / wss-server-config-1.0.xml} FINE:[Web-Security]设置策略上下文ID:old = null ctxID = CHAPTER_x_12_Container_Managed_Authentication_and_Authorization / CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE:[Web-Security] hasUserDataPermission perm:(javax.security.jacc.WebUserDataPermission / j_security_check POST)FINE:[Web-Security] hasUserDat aPermission isGranted:true FINE:使用JAAS模块登录用户[admin@gmail.com]:DBRealm:jdbcRealm FINE:初始化登录模块:class com.sun.enterprise.security.auth.login.JDBCLoginModule SEVERE:SEC1112:不能validationJDBC领域的用户[admin@gmail.com]。 FINE:无法validation用户javax.security.auth.login.LoginException:无法连接到数据库用户用户的数据源jdbc / security。 at com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.getConnection(JDBCRealm.java:550)at com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.isUserValid(JDBCRealm.java:393) at com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.authenticate(JDBCRealm.java:311)at com.sun.enterprise.security.auth.login.JDBCLoginModule.authenticate(JDBCLoginModule.java:72)at com .sun.enterprise.security.auth.login.PasswordLoginModule.authenticateUser(PasswordLoginModule.java:90)at com.sun.appserv.security.AppservPasswordLoginModule.login(AppservPasswordLoginModule.java:141)at sun.reflect.NativeMethodAccessorImpl.invoke0(Native方法)at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method.java:597)at javax.security.auth.login.LoginContext.invoke(LoginContext.java:769),位于javax.security.auth.login.LoginContext.access $ 000(LoginContext.java: 186)javax.security.auth.login.LoginContext $ 4.run(LoginContext.java:683)at java.security.AccessController.doPrivileged(Native Method)at javax.security.auth.login.LoginContext.invokePriv(LoginContext.java) :680)在com.sun的com.sun.enterprise.security.auth.login.LoginContextDriver.doPasswordLogin(LoginContextDriver.java:341)的javax.security.auth.login.LoginContext.login(LoginContext.java:579)。 enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:199)位于com.sun.web.security的com.sun.enterprise.security.auth.login.LoginContextDriver.login(LoginContextDriver.java:152)。 RealmAdapter.authenticate(RealmAdapter.java:479)位于org.apache.catalina.authenticator.FormAuthenticator.authenticate(FormAuthenticator.java:264)的com.sun.web.security.RealmAdapter.authenticate(RealmAdapter.java:418) .apache.catalina.authenticator.AuthenticatorBase.processSecurityCheck(AuthenticatorBase.java:1015)at org.apache.catalina.authenticator.AuthenticatorBase.invoke(Authenti) catorBase.java:614)位于com.sun.enterprise的com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:97)的org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:615)位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:185)的org.apache.catalina.connector.CoyoteAdapter.doService上的.web.PESessionLockingStandardPipeline.invoke(PESessionLockingStandardPipeline.java:85)(CoyoteAdapter.java:325 )在com.sun.grizzly的com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:165)的org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:226)。 http.ProcessorTask.invokeAdapter(ProcessorTask.java:791)位于com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:693)的com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:954) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:170)at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:135) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:102)at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:88)at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java) :76)at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:53)at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:57)at com.sun.grizzly.ContextTask.run(ContextTask。 java:69)at com.sun.grizzly.util.AbstractThreadPool $ Worker.doWork(AbstractThreadPool.java:330)at com.sun.grizzly.util.AbstractThreadPool $ Worker.run(AbstractThreadPool.java:309)at java.lang .Thread.run(Thread.java:662)引起:javax.naming.NamingException:在com.sun.enterprise中查找SerialContext中的’jdbc / security’失败[根exception是javax.naming.NameNotFoundException:找不到安全性]位于javax.naming.InitialCo的javax.naming.InitialContext.lookup(InitialContext.java:392)的.naming.impl.SerialContext.lookup(SerialContext.java:442) n.sk.lookup(InitialContext.java:392)位于com.sun.enterprise.connectors.service.ConnectorResourceAdminServiceImpl.lookup(ConnectorResourceAdminServiceImpl.java:203)的com.sun.enterprise.connectors.ConnectorRuntime.lookupNonTxResource(ConnectorRuntime.java:440)在com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm.getConnection(JDBCRealm.java:538)… 44更多引起:javax.naming.NameNotFoundException:在com.sun.enterprise.naming找不到安全性.impl.TransientContext.doLookup(TransientContext.java:197)at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext.java:168)at com.sun.enterprise.naming.impl.TransientContext.lookup(TransientContext .java:172)com.com的com.sun.enterprise.naming.impl.SerialContextProviderImpl.lookup(SerialContextProviderImpl.java:58)com.sun.enterprise.naming.impl.LocalSerialContextProviderImpl.lookup(LocalSerialContextProviderImpl.java:101)。 sun.enterprise.naming.impl.SerialContext.lookup(SerialContext.java:430)… 49更多

罚款:JAAS身份validation中止。 警告:Web登录失败:登录失败:javax.security.auth.login.LoginException:安全exceptionFINE:[Web-Security]策略上下文ID为:CHAPTER_x_12_Container_Managed_Authentication_and_Authorization / CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE:[Web-Security] hasUserDataPermission perm:(javax.security .jacc.WebUserDataPermission /error.xhtml GET)FINE:[Web-Security] hasUserDataPermission isGranted:true

更新3

也许连接池有一些问题。 这是我的连接池的样子:

在此处输入图像描述

在此处输入图像描述

在此处输入图像描述

我没有太多属性,也许有些东西丢失了?

此外,我现在创建了一个JDBC资源,如下所示:

在此处输入图像描述

(领域中的JNDI名称已更改为jdbc / studydb)

我的persistence.xml看起来像这样:

    jdbc/studydb entities.User entities.Group   

我想我取得了一些进展,现在我看到的例外是:

 > SEVERE: jdbcrealm.invaliduserreason > FINE: Cannot validate user > java.sql.SQLSyntaxErrorException: Schema 'ADMIN' does not exist > at org.apache.derby.client.am.SQLExceptionFactory40.getSQLException(Unknown > Source) > .... > > Caused by: org.apache.derby.client.am.SqlException: Schema 'ADMIN' does not exist > at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source) > ... > FINE: JAAS authentication aborted. > WARNING: Web login failed: Login failed: javax.security.auth.login.LoginException: Security Exception > FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization > FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission /error.xhtml GET) > FINE: [Web-Security] hasUserDataPermission isGranted: true > WARNING: PWC4011: Unable to set request character encoding to UTF-8 from context > /CHAPTER_12_x_Container_Managed_Authentication_and_Authorization, > because request parameters have already been read, or > ServletRequest.getReader() has already been called 

更新4

我更改了数据库,它组织错误,所以我对我的实体进行了一些更改:

 @Entity @Table(name="USERS", schema="ADMIN") public class User implements Serializable { private static final long serialVersionUID = -1244856316278032177L; @Id @Column(nullable = false) private String userid; @Column(nullable = false) private String password; @ManyToOne @JoinTable(name="USER_GROUP",schema="ADMIN", joinColumns = @JoinColumn(name="userid", referencedColumnName="userid"), inverseJoinColumns=@JoinColumn(name="groupid", referencedColumnName= "groupid") ) private Group group; //GET & SET METHODS 

@Entity @Table(name =“GROUPS”,schema =“ADMIN”)公共类组实现Serializable {

 private static final long serialVersionUID = -7274308564659753174L; @Id @Column(nullable = false) private String groupid; @OneToMany(mappedBy="group") private Set users; 

//获取和设置方法

所以我还要编辑DBRealm,现在它看起来像这样:

在此处输入图像描述

但是当我登录时,我再次得到一个例外:

 FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission /j_security_check POST) FINE: [Web-Security] hasUserDataPermission isGranted: true FINE: Logging in user [user@gmail.com] into realm: DBRealm using JAAS module: jdbcRealm FINE: Login module initialized: class com.sun.enterprise.security.auth.login.JDBCLoginModule SEVERE: SEC1111: Cannot load group for JDBC realm user [user@gmail.com]. FINE: Cannot load group java.sql.SQLSyntaxErrorException: Column 'USERID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'USERID' is not a column in the target table. .... .... Caused by: org.apache.derby.client.am.SqlException: Column 'USERID' is either not in any table in the FROM list or appears within a join specification and is outside the scope of the join specification or appears in a HAVING clause and is not in the GROUP BY list. If this is a CREATE or ALTER TABLE statement then 'USERID' is not a column in the target table. at org.apache.derby.client.am.Statement.completeSqlca(Unknown Source) .... .... FINE: JAAS login complete. FINE: JAAS authentication committed. FINE: Password login succeeded for : user@gmail.com FINE: permission check done to set SecurityContext FINE: Set security context as user: user@gmail.com FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission GET) FINE: [Web-Security] hasUserDataPermission isGranted: true FINE: permission check done to set SecurityContext FINE: SecurityContext: setCurrentSecurityContext method called FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE: [Web-Security] hasUserDataPermission perm: (javax.security.jacc.WebUserDataPermission /adminpanel.xhtml GET) FINE: [Web-Security] hasUserDataPermission isGranted: true FINE: [Web-Security] Policy Context ID was: CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE: [Web-Security] Generating a protection domain for Permission check. FINE: [Web-Security] Checking with Principal : user@gmail.com FINE: [Web-Security] Checking with Principal : visitors FINE: [Web-Security] Checking with Principal : users FINE: [Web-Security] Checking with Principal : administrators FINE: [Web-Security] Codesource with Web URL: file:/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization/CHAPTER_x_12_Container_Managed_Authentication_and_Authorization FINE: [Web-Security] Checking Web Permission with Principals : user@gmail.com, visitors, users, administrators FINE: [Web-Security] Web Permission = (javax.security.jacc.WebResourcePermission /adminpanel.xhtml GET) FINE: [Web-Security] hasResource isGranted: true FINE: [Web-Security] hasResource perm: (javax.security.jacc.WebResourcePermission /adminpanel.xhtml GET) FINE: SecurityContext: setCurrentSecurityContext method called WARNING: Resource not found: com/sun/enterprise/v3/admin/adapter/theme/com/sun/webui/jsf/suntheme/images/masthead/masthead_button_over.gif 

您的配置中有一些缺少的位:

  • 密码以明文forms存储在数据库中。 这很可能是不正确的。 Glassfish 3.1默认使用SHA-256算法,因此JDBC Realm将无法对用户进行身份validation,因为数据库中的存储值与Realm创建的摘要不匹配。 您需要在领域配置中指定显式摘要算法,或者依赖于默认值。 此外,您还需要确保应用程序在创建新用户或修改其密码时创建摘要。 如果要以明文forms存储密码,则必须为摘要算法指定“无”值。
  • 仅指定摘要算法是不够的。 您需要指定存储摘要的编码(因为,摘要只是一个字节序列,并且可能不会存储为纯ASCII序列)。 Glassfish支持Hex和Base64编码,默认情况下使用Hex编码。 因此 ,在存储密码摘要之前, 您的应用应该应用与领域中配置的编码相同的编码 。 请注意,当您指定摘要算法“none”以明文forms存储密码时,您无需对存储的密码进行编码(同样,您也无需指定编码); 至少这是我从阅读Glassfish资料中观察到的。
  • 此外,用户组映射目前似乎是1:1。 您可能希望使用单独的连接表以允许组和用户之间的1:N映射。
  • 您还需要确保启用“默认主体到角色映射”选项。 如果没有此选项,则需要手动将web.xml中的角色映射到领域中的用户和组 。

关于使用form而不是h:form的主题,其根本原因是JSF运行时不允许您指定h:form标记的action属性。 在对响应进行编码时,此值由JSF运行时设置,因此,当您使用h:form标记时,将无法指定j_security_check的值。 文档明确说明了这一点 :

“action”属性的值必须是将当前视图的视图标识符传递给此应用程序的ViewHandlergetActionURL()方法,然后将该String传递给ExternalContext上的encodeActionURL()方法的结果。

更新

根据发布的堆栈跟踪,我可以推断出Realm使用的JNDI数据源(在JNDI字段中指定)在Glassfish域中不可用。 JDBC Realm的先决条件之一是在Glassfish域配置中注册JNDI数据源,其连接池用于连接到底层数据库。

以下是我的Glassfish域配置文件( domain.xml )的片段,其中JNDI DataSource(jdbc / galleriaDS)使用连接池(GalleriaPool),最终由JDBC Realm(GalleriaRealm)使用:

   ...                   ...    ...   ...              ...   ...  ...  

更新#2 – 获取JDBC Realm针对Derby执行的SQL语句

看起来SQL查询的结构与您准备的数据库模型不匹配。 您可以通过derby.language.logStatementText系统属性derby.language.logStatementText JDBC领域针对Derby实例执行的SQL语句。 可以将此属性设置为true作为derby.properties文件中的静态值,它将在重新启动Derby实例时生效。 derby.properties文件需要具有以下条目:

 derby.language.logStatementText=true 

并且此文件必须放在Derby实例的当前工作目录中。 当前工作目录通常是包含Derby数据库的目录,并且可以在Derby启动期间使用derby.system.home JVM参数显式指定:

 -Dderby.system.home=C:\derby 

Derby执行的所有SQL语句现在都将记录在derby.log文件中。

根据提供的信息,我的印象是有一个名为GROUPS的单独表用于存储组信息,这与连接表 – USER_GROUP 。 在这种情况下,您的领域必须配置为将Group表作为USER_GROUP而不是GROUP ; 您可以通过查看JDBC领域发出的SQL查询来确认这一点。

为了阐明上述观点,JDBC领域配置中的Group字段不用于指定存储组信息的表。 相反,它用于指定存储组 – 用户映射的表。 在1:1映射中,Group表可以存储此信息,但是在1:M或通常在M:M场景中,您将拥有包含映射的单独表。 JDBC领域发出的SQL查询使用映射表而不是实际的组表(如果它们不同)来确定用户所属的组。

除了Vineet的答案之外,我还注意到在GlassFish的Security选项卡中未选中选项安全管理器,应该启用该选项以便在Realm中使用Security。

如果您使用JDBC JNDI名称,则不需要为JDBC领域提供用户名/密码

我已经在Sailfin上做了这个(基于Glassfish 2)。

首先,我没有看到任何sun-web.xml文件将web.xml文件中定义的角色映射到定义数据库的组。

其次,根据本教程: http : //codepimpsdotorg.blogspot.com/2007/12/glassfish-jdbc-realm-authentication.html您必须指定一个摘要算法(“none”不是一个选项,不确定它是否仍然存在在Glassfish中也是如此3)。

第三,表和列需要按特定顺序排列,我们使用以下结构:

 @Entity @Table(name = "AuthenticationUser") public class UserEntity implements Serializable, Identifiable { private static final long serialVersionUID = -1213555368237839900L; @Id @Column(name = "name", length = 20) private String itsName; @Column(name = "password", length = 1024) private String itsPassword; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "groupName", referencedColumnName = "name") private GroupEntity itsGroupEntity; ... 

 @Entity @Table(name = "AuthenticationGroup") public class GroupEntity implements Serializable, Identifiable { private static final long serialVersionUID = -1213554368237839900L; private static final String USER_GROUP_COLUMN = "itsGroupEntity"; @Id @Column(name = "name", length = 20) private String itsName; @OneToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY, mappedBy=USER_GROUP_COLUMN) private List itsUsers; ... 

并定义领域:

 user-table=AuthenticationUser user-name-column=name password-column=password group-table=AuthenticationUser group-name-column=groupName 

重要信息:用户名和组名属于同一个表! 因此表AuthenticationGroup仅供我们内部使用,但Glassfish不使用。

我遇到了同样的问题。

I solved this problem by renaming the password to(User_password) and the userName (User_name) fields in the table (anything other than username and password will do), somehow using “userName” and “password” causes some conflict while performing authentication using Realms.

Also put Digest Algorithm: = none in case you are storing the password as plain text.

In the Security menu, Enable the Default Principal to Role Mapping.

希望这可以帮助,