我在Java EE中遇到安全问题。 我有一个应用程序应该是一种电子商店。我有三个实体: 未映射到数据库的用户类,以及映射到不同表的两个继承类 - 客户端和管理员:
@MappedSuperclass
@Inheritance(strategy= InheritanceType.TABLE_PER_CLASS)
public class User implements Serializable {...}
@Entity
public class Client extends User {...}
@Entity
public class Administrator extends User {...}
现在我需要为客户端和管理员资源提供安全性。我在jdbcRealm和标准登录页面使用FORM身份验证:
<form action="j_security_check" method="POST"> <input type="text" name="j_username"/> <input type="password" name="j_password"/> <input type="submit" value="Login"/> </form>
但问题是jdbcRealm只引用一个表。并且不允许在web.xml中设置两个jdbcRealms。那么如何在不改变数据库结构的情况下为客户端和管理员提供身份验证?是否可以在单个应用程序中使用少量jdbcRealms?
答案 0 :(得分:2)
您可以使用组合域来组合两个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>
这样你只需要在数据源中设置连接字符串,而不是在域中复制。
N.B。就个人而言,我会质疑是否有一个不同的ADMINISTRATOR和USER表是一个好主意,如果你有一个既是客户端又是管理员的用户名会发生什么,所以你必须确保这不会不会发生,通过只对一个表进行约束会更容易。