GlassFish配置JDBC Realm
- 1 min数据库结构
-
USERS表
CREATE TABLE USERS ( USERID VARCHAR(50) NOT NULL, PASSWORD VARCHAR(128) NOT NULL );
-
GROUPS表
CREATE TABLE GROUPS ( GROUPID VARCHAR(20) NOT NULL );
-
USERS_GROUPS联接表
CREATE TABLE USERS_GROUPS ( GROUPID VARCHAR(20) NOT NULL, USERID VARCHAR(50) NOT NULL );
Glassfish JDBCRealm配置片段来自domain.xml
注意,该group-name-column属性的值为GROUPID,映射到GROUPID连接表的列USERS_GROUPS而不是组表GROUPS。 这是因为JDBCRealm发出以下SQL语句(如果您反编译com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm该类)
密码查询,用户Id是从DigestLoginModule传递的参数:
SELECT <passwordColumn> FROM <userTable> WHERE <userNameColumn> = ?;
组查询,用户ID作为参数传递:
SELECT <groupNameColumn> FROM <groupTable> WHERE <groupTableUserNameColumn> = ?;
当您考虑第二个查询的结构时,很明显组表必须包含映射到组ID的用户ID(这会导致映射到多个组的用户的组数据重复),或者组表必须是将用户映射到组的连接表。
下面是我按照上述原理配置的JDBCRealm
-
我数据库的结构
-
我的JDBCRealm配置
-
注意:
JAAS Context 一定得填
jdbcRealm
,否则会报错javax.security.auth.login.LoginException:没有为 MyRealm 配置LoginModules
User Name Column
一定要填user
表的主键(即primerykey
)
Group Table User Name Column
也一定要填组表(在这里指group_has_user
表)关联到user.id
的外键group_has_user.id
否则GlassFish服务器会报错严重:jdbcrealm.grouperror
。即使不报错还是会导致用户权限约束失效
参考
如果你在中国大陆地区,则需要连接外网才能进行评论
comments powered by Disqus