0

我在 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 {...}

现在我需要为客户端和管理员资源提供安全性。我将 FORM 身份验证与 jdbcRealm 和标准登录页面一起使用:

    <form action="j_security_check" method="POST">
        <input type="text" name="j_username"/>
        <input type="password" name="j_password"/>
        <input type="submit" value="登录"/>
    </form>

但问题是 jdbcRealm 只引用一张表。并且不允许在 web.xml 中设置两个 jdbcRealms。那么如何在不改变数据库结构的情况下为客户和管理员提供身份验证呢?是否可以在单个应用程序中使用少量 jdbcRealms?

4

1 回答 1

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&amp;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&amp;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 表是否是个好主意,因为如果您的用户名既是客户端又是管理员会发生什么,因此您必须确保不会发生,这更容易通过仅对一张表进行约束。

于 2011-08-12T13:52:46.680 回答