您可以使用组合领域来组合两个 JDBC 领域:
在 $CATALINA_BASE/conf/server.xml
<Realm className="org.apache.catalina.realm.CombinedRealm" >
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/db?user=dbuser&password=dbpass"
userTable="client"
userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
<Realm className="org.apache.catalina.realm.JDBCRealm"
driverName="org.gjt.mm.mysql.Driver"
connectionURL="jdbc:mysql://localhost/db?user=dbuser&password=dbpass"
userTable="administrator"
userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>
但是,在这种情况下,最好设置一个数据源并使用 DataSourceRealm 来访问表。
<Realm className="org.apache.catalina.realm.CombinedRealm" >
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/authority"
userTable="clients" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
<Realm className="org.apache.catalina.realm.DataSourceRealm"
dataSourceName="jdbc/authority"
userTable="administrators" userNameCol="user_name" userCredCol="user_pass"
userRoleTable="user_roles" roleNameCol="role_name"/>
</Realm>
这样,您只需要在数据源中设置连接字符串,而不是在领域中复制。
NB 就个人而言,我会质疑拥有不同的 ADMINISTRATOR 和 USER 表是否是个好主意,因为如果您的用户名既是客户端又是管理员会发生什么,因此您必须确保不会发生,这更容易通过仅对一张表进行约束。