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


Glassfish レルム:
グラスフィッシュレルム


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 に答える