【问题标题】:How can I provide security in a web-application by jdbcRealm when I have few user tables当我的用户表很少时,如何通过 jdbcRealm 在 Web 应用程序中提供安全性
【发布时间】:2011-10-25 19:53:47
【问题描述】:

我在 Java EE 中遇到了安全问题。 我有一个应用程序,它应该是一种电子商店。我有三个实体: 未映射到数据库的用户类,以及映射到不同表的两个继承类 - Client 和 Administrator:

@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" 方法="POST"&gt &ltinput type="text" name="j_username"/&gt &ltinput type="password" name="j_password"/&gt &ltinput type="提交" value="登录"/&gt &lt/形式&gt

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

【问题讨论】:

    标签: jakarta-ee security jdbcrealm


    【解决方案1】:

    您可以使用组合领域来组合两个 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>
    

    这样你只需要在数据源中设置连接字符串,而不是在领域中复制。

    注意就个人而言,我会质疑拥有不同的 ADMINISTRATOR 和 USER 表是否是个好主意,因为如果您的用户名既是客户端又是管理员会发生什么,因此您必须确保这不会不会发生,通过仅对一张表进行约束会更容易。

    【讨论】:

    • 非常感谢您的帮助!这些不同的表我已经遇到了另一个问题,因此将所有数据放在一个表中确实会更好。但我是 Java EE 的新手,这个项目更多是为了培训。无论如何,如果我将管理员和客户数据放在同一个表中,它会有很多空字段,所以会导致数据库扩展。我说的对吗?
    • 如果您可以更改表结构,那么可能值得考虑使用 InheritanceType.JOINED 和 @MappedSuperclass 来拥有一个 USER 表(具有公共列,将在 JDBCRealm 中使用)以及一个 ADMINISTRATOR 和 CLIENT 表。这些将由一个 id 列连接。请参阅docs.jboss.org/hibernate/annotations/3.5/reference/en/html/…(第 2.2.4.3 和 2.2.4.4 节)
    猜你喜欢
    • 2012-05-27
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2013-03-21
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    相关资源
    最近更新 更多