JDBC Realm不为用户加载任何组[403 Forbidden]

时间:2013-10-19 04:27:34

标签: java-ee jdbc glassfish jaas jdbcrealm

在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境界:
Glassfish realm


1 个答案:

答案 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命令。