Здравствуйте, подскажите пожалуйста где можно достать материалы по курсу Кросс-платформенные и многозвенные технологии, о которых говориться, к примеру, в Лекции 2. Пример "Служба мгновенных сообщений" |
Технология 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. Их значения извлекаются из последних параметров, переданных программе в командной строке.