Как я могу обеспечить безопасность в веб-приложении с помощью jdbcRealm, когда у меня мало пользовательских таблиц - PullRequest
0 голосов
/ 12 августа 2011

У меня проблема с безопасностью в 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 {...}

Теперь мне нужно обеспечить безопасность ресурсов клиента и администратора. Я использую аутентификацию FORM с jdbcRealm и стандартной страницей входа в систему:


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

Но проблема в том, что jdbcRealm ссылается только на одну таблицу. И не разрешено устанавливать два jdbcRealms в web.xml. Итак, как я могу обеспечить аутентификацию для клиента и администратора без изменения структуры базы данных? Можно ли использовать несколько jdbcRealms в одном приложении?

1 Ответ

2 голосов
/ 12 августа 2011

Вы можете использовать объединенную область для объединения двух областей 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, как, например, что произойдет, если у вас есть имя пользователя, которое является одновременно клиентом и администратором, поэтому вам нужно убедиться, что этоне происходит, что намного проще, если иметь ограничение только для одной таблицы.

...