在Glassfish中使用JDBCRealm作为身份验证方法时,由于没有为用户加载任何组/角色,因此无法登录用户。这通常只能通过您的应用程序上的403 Not Authorized消息来显示。
为core.security启用FINEST日志记录显示以下内容:
FINE: Login module initialized: class com.sun.enterprise.security.auth.login.JDBCLoginModule
FINEST: JDBC login succeeded for: user@gmail.com groups:[]
FINE: JAAS login complete.
如您所见,组是空的。
表:
CREATE TABLE users (
ID int(11) NOT NULL,
EMAIL varchar(255) NOT NULL,
PASSWORD longtext NOT NULL,
SALT longtext NOT NULL,
...
PRIMARY KEY (ID),
UNIQUE KEY EMAIL (EMAIL),
...
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
CREATE TABLE `users_groups` (
`ID` int(11) NOT NULL,
`groupname` varchar(255) NOT NULL,
KEY `FK_USERS_GROUPS_ID` (`ID`),
CONSTRAINT `FK_USERS_GROUPS_ID` FOREIGN KEY (`ID`) REFERENCES `users` (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
Glassfish境界:
答案 0 :(得分:0)
这是由JDBCRealm在users_groups表中查找与id ='user@gmail.com'匹配的组引起的,实际上它应该在users_groups表中查找与id = 1匹配的组(主键是用户)。
要修复此问题,请将users_groups表外键更改为引用EMAIL:
CREATE TABLE `users_groups` (
`ID` int(11) NOT NULL,
`groupname` varchar(255) NOT NULL,
KEY `FK_USERS_GROUPS_ID` (`ID`),
CONSTRAINT `FK_USERS_GROUPS_ID` FOREIGN KEY (`ID`) REFERENCES `users` (`EMAIL`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8$$
或者在JPA中,
@JoinColumn(name = "id", referencedColumnName = "email"))
这似乎是JDBCRealm中的一个缺陷,但众所周知它是不灵活的。
有关进一步调试(以及我如何解决),请通过启用MySQL(此处为“您的数据库”)日志来查看原始SQL命令。