0

在 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$$


玻璃鱼领域:
玻璃鱼领域


4

1 回答 1

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('your database here') 日志来查看原始 SQL 命令。

于 2013-10-19T04:27:33.953 回答