0

Java EE のセキュリティに問題があります。一種の e ショップであるはずのアプリケーションがあります。データベースにマップされていないユーザークラスと、異なるテーブルにマップされているクライアントと管理者の 2 つの継承されたクラスの 3 つのエンティティがあります。

@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="ログイン"/>
    </フォーム>

しかし問題は、jdbcRealm が 1 つのテーブルしか参照しないことです。また、web.xml で 2 つの jdbcRealms を設定することはできません。では、データベース構造を変更せずに、クライアントと管理者の両方に認証を提供するにはどうすればよいでしょうか? 単一のアプリケーションで少数の jdbcRealms を使用することは可能ですか?

4

1 に答える 1

2

結合レルムを使用して、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 テーブルを用意するのが良い考えかどうか疑問に思います。クライアントと管理者の両方のユーザー名を持っているとどうなるかということです。これは、1 つのテーブルだけに制約を設定することではるかに簡単になります。

于 2011-08-12T13:52:46.680 に答える