我将GlassFish设置为使用“JDBCRealm”。配置看起来像这样,它工作正常:
<JDBCRealm userTable="users" userNameCol="user_name"
userCredCol="user_pass" userRoleTable="user_roles"
roleNameCol="role_name" ... />
我的数据库目前看起来像这样:
- USERS -
USER_NAME | USER_PASS
steve | password1
- USER_ROLES -
USER_NAME | ROLE_NAME
steve | ADMIN
我的问题是,如果我想规范化数据库中的数据,我该如何配置一个能够理解新数据库设计的领域?我是否必须编写一个自定义的“领域”对象或类似的东西?
相反,我希望我的数据库看起来像这样:
- USERS -
USER_ID | USER_NAME | USER_PASS
1 | steve | password1
- ROLES -
ROLE_ID | ROLE_NAME
2 | ADMIN
- USER_ROLES -
USER_ID | ROLE_ID
1 | 2
非常感谢任何帮助!
答案 0 :(得分:1)
它应该直截了当。我几天前就为Glassfish服务器做过这件事。但我认为Tomcat应该是类似的。我有3张桌子:
我的JDBC领域如下所示:
<auth-realm name="Register-User" classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm">
<property name="jaas-context" value="jdbcRealm" />
<property name="datasource-jndi" value="jdbc/ladb" />
<property name="user-table" value="user" />
<property name="user-name-column" value="login" />
<property name="password-column" value="password" />
<property name="group-table" value="group_has_user" />
<property name="group-name-column" value="group_id" />
<property name="digest-algorithm" value="SHA-256" />
如果您遇到问题,请确保列group_id在组表和连接表中具有相同的名称。
答案 1 :(得分:1)
我们解决此问题的方法是规范化数据库并为glassfish创建视图。
Table "public.admin"
Column | Type | Modifiers
---------------+-----------------------------+-----------
id | bigint | not null
login | character varying(255) | not null
password | character varying(255) | not null
Table "public.role"
Column | Type | Modifiers
--------+------------------------+-----------
id | bigint | not null
name | character varying(255) |
Table "public.role_admins"
Column | Type | Modifiers
----------+--------+-----------
role_id | bigint | not null
admin_id | bigint | not null
以下是观点:
View "public.v_admin_role"
Column | Type | Modifiers
-----------+------------------------+-----------
login | character varying(255) |
password | character varying(255) |
role_name | character varying(255) |
View definition:
SELECT a.login, a.password, r.name AS role_name
FROM admin a
JOIN role_admins ra ON ra.admin_id = a.id
JOIN role r ON r.id = ra.role_id
WHERE a.active = true;
和配置
<auth-realm classname="com.sun.enterprise.security.auth.realm.jdbc.JDBCRealm" name="gcsiadmin">
<property name="user-name-column" value="login"/>
<property name="password-column" value="password"/>
<property name="group-name-column" value="role_name"/>
<property name="datasource-jndi" value="jdbc/GcsiDS"/>
<property name="user-table" value="v_admin_role"/>
<property name="group-table" value="v_admin_role"/>
<property name="jaas-context" value="jdbcRealm"/>
</auth-realm>