2011-08-12 18 views
0

我在Java EE中遇到安全問題。 我有一個應用程序,應該是一種電子商店。我有三個實體: User類未映射到數據庫中,和兩個繼承的類 - 客戶端和管理員,被映射到不同的表:當我有幾個用戶表時,如何通過jdbcRealm提供Web應用程序的安全性

@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認證:

 

    &ltform action="j_security_check" method="POST"> 
     &ltinput type="text" name="j_username"/> 
     &ltinput type="password" name="j_password"/> 
     &ltinput type="submit" value="Login"/> 
    </form> 

但問題是,jdbcRealm只是指一個表。並且不允許在web.xml中設置兩個jdbcRealms。那麼如何在不改變數據庫結構的情況下爲客戶端和管理員提供身份驗證?是否可以在單個應用程序中使用幾個jdbcRealms?

回答

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> 

這樣你只需要在數據源中設置連接字符串,而不是在領域中有重複。

N.B.就我個人而言,我會懷疑是否有一個不同的ADMINISTRATOR和USER表是不錯的主意,如果你有一個既是客戶端又是管理員的用戶名,會發生什麼情況,所以你必須確保這樣做不會發生,這隻需要對一個表格進行約束就容易得多。

+0

非常感謝您的幫助!我對這些不同的表已經有了另一個問題,所以將所有數據放在一個表中會更好。但我是Java EE的新手,這個項目更多是爲了培訓。無論如何,如果我將管理員和客戶端數據放入同一個表中,它會有很多空白字段,所以會導致數據庫擴展。我對嗎? –

+0

如果您可以對錶結構進行更改,那麼使用InheritanceType.JOINED和@MappedSuperclass可能會有一個USER表(具有將在JDBCRealm中使用的公共列)以及ADMINISTRATOR和CLIENT表。這些將通過id列加入。見http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html/entity.html#d0e1168(第2.2.4.3和2.2.4.4節) – beny23

相關問題