Опубликован: 18.03.2010 | Уровень: специалист | Доступ: платный
Лекция 4:

Технология Enterprise Java Beans. Часть 2

Безопасность в EJB

Безопасность является серьезной задачей в enterprise приложениях, поэтому технология EJB предоставляет средства для ее решения. Обеспечение безопасности приложения включает в себя три подзадачи.

  • Аутентификация (Authentication).Аутентификация - это процесс подтверждения личности пользователя, пытающегося получить доступ в систему. Чаще всего подтверждение личности представляет собой ввод пароля, хотя возможны и более экзотические варианты, например, сканирование отпечатков пальцев или сетчатки глаза.
  • Авторизация (Authorization).Авторизация заключается в определении того, какие действия может и не может совершать каждый пользователь, вошедший в систему. Например, одним пользователям может быть дан доступ на запись в базу данных, другие же могут только читать из нее данные.
  • Конфиденциальность (Confidentiality).Требуется защитить данные, передаваемые по каналам связи между системой и пользователями, от перехвата и фальсификации злоумышленниками. Обычно для этого используется шифрование, например, SSL.

Авторы спецификации EJB сосредоточились на решении задачи авторизации, оставив остальные задачи разработчикам EJB -контейнеров.

Обычно аутентификация происходит на уровне JNDI,при создании контекста. Когда пользователь подключается к EJB системе, с ним ассоциируется определенный идентификатор безопасности ( security identity ). Этот идентификатор неявно передается при каждом вызове методов EJB.На основе идентификатора безопасности контейнер EJB решает, имеет ли пользователь право на совершение запрошенной операции. В EJB реализована авторизация на основе ролей. Каждому подключенному к системе пользователю присваивается роль, например, "служащий", "менеджер", "администратор". В то же время, каждому методу EJB приписывается набор ролей пользователей, имеющих право на вызов этого метода. В момент вызова метода пользователем производится проверка того, что роль пользователя является одной из допустимых ролей вызываемого метода. Допустимые роли определяются а ннотацией @javax.annotation.security.RolesAllowed, принимающей в качестве параметра массив строк - названий ролей.

Аннотация @javax.annotation.security.PermitAll позволяет открыть доступ к методу пользователям, играющим любые роли.

Аннотация @javax.annotation.security.RunAs задает роль, от имени которой метод EJB будет вызывать другие методы. По умолчанию метод работает в роли вызвавшего его пользователя.

Пример: ограничение доступа к методам EJB

В этом примере мы добавим защиту от несанкционированного доступа к написанному в предыдущем разделе EJB,реализующему операции с банковскими счетами. Дадим доступ к методам BankBean работникам банка, запретив его всем остальным. Соответствующую роль назовем BankEmployee. Желаемого эффекта можно добиться, добавив следующую аннотацию к объявлению класса BankBean:

@Stateless
@RolesAllowed("BankEmployee")
public class BankBean implements Bank  {
...

Также необходимы дополнительные настройки контейнера EJB. Мы рассмотрим настройки контейнера JBoss.

Во-первых, необходимо обновить дескриптор развертывания приложения:

<?xml version="1.0" encoding="UTF-8"?>
<jboss>
<enterprise-beans>
<session>
<ejb-name>BankBean</ejb-name>
<jndi-name>SecureBank/Remote</jndi-name>
</session>
</enterprise-beans>
<security-domain>SecureBank</security-domain>
</jboss>

Security domain - это база данных пользователей. Приложения могут пользоваться общей базой, а могут иметь свои собственные базы пользователей. Мы используем security domain, который мы назвали SecureBank.

Во-вторых, требуется описать используемый security domain в конфигурационных файлах JBoss.Для это добавим следующие строки в файл ${jboss_home}/server/default/conf/login-config.xml:

<application-policy name="SecureBank">
<authentication>
<login-module
code="org.jboss.security.auth.spi.UsersRolesLoginModule"
flag="required">
<module-option name="usersProperties">
props/bank-users.properties
</module-option>
<module-option name="rolesProperties">
props/bank-roles.properties
</module-option> </login-module> </authentication> </application-policy>

Этот способ настройки пользователей использует два текстовых файла. Первый из них, props/bank-users.properties, задает пользователей и их пароли:

vladykin=asdfgh

Второй, props/bank-roles.properties, задает роли пользователей:

vladykin=BankEmployee

Потребует небольших изменений и наша тестовая программа. Информация о пользователе и его пароле передается при подключении к EJB -контейнеру средствами JNDI:

Hashtable<String, String> env = new Hashtable<String,   String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "org.jboss.security.jndi.JndiLoginInitialContextFactory");
env.put(Context.PROVIDER_URL, "localhost:1099"); 
env.put(Context.SECURITY_PRINCIPAL, args[3]);
env.put(Context.SECURITY_CREDENTIALS, args[4]);

За это отвечают параметры SECURITY_PRINCIPAL и SECURITY_CREDENTIALS. Их значения извлекаются из последних параметров, переданных программе в командной строке.

Антон Зубеков
Антон Зубеков

Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений"

Ярославй Грива
Ярославй Грива
Россия, г. Санкт-Петербург
Ольга Малых
Ольга Малых
Россия, Казань, Университет управления "ТИСБИ"