····timerService.createCalendarTimer(birthDay, new TimerConfig(customer, true));
··}
··@Timeout
··public void sendBirthdayEmail(Timer timer) {
····Customer customer = (Customer) timer.getInfo();
····//…
··}
}
После создания таймера контейнер будет вызывать метод @Timeout (sendBirthdayEmail()) каждый год. В него будет передаваться объект типа Timer. Поскольку таймер был сериализован вместе с объектом типа customer, метод может получить к нему доступ, вызвав метод getInfo(). Обратите внимание, что компонент может иметь не более одного метода, аннотированного @Timeout, для работы с таймерами, создаваемыми программно.
Авторизация
Основная цель модели безопасности EJB заключается в управлении доступом к бизнес-коду. В Java EE аутентификация обрабатывается на веб-уровне (или в клиентском приложении), принципал и его роль передаются на уровень EJB, а EJB проверяет, может ли аутентифицированный пользователь получить доступ к методу, основываясь на заданной роли. Авторизация может быть реализована либо декларативным, либо программным образом.
Если вы выберете декларативную авторизацию, то контроль доступа будет осуществляться контейнером EJB. При программной авторизации контроль доступа производится в коде с использованием JAAS API.
Декларативная авторизация
Декларативная авторизация может быть определена в компоненте с помощью аннотаций или дескриптора развертывания XML. Декларативная авторизация включает в себя объявление ролей, назначение уровня доступа методам (или всему компоненту) либо временное изменение сущности безопасности. Эти элементы управления созданы с помощью аннотаций, описанных в табл. 8.6. Каждая аннотация может быть использована как для компонента, так и для метода.
Аннотация | Компонент | Метод | Описание |
---|---|---|---|
@PermitAll | X | X | Означает, что заданный метод (или целый компонент) доступен для всех (доступ для всех ролей) |
@DenyAll | X | X | Означает, что ни одна роль не может выполнять заданный метод или все методы компонента (доступа нет ни у одной роли). Это может быть полезно, если вы хотите запретить доступ к методу в определенных условиях (например, метод launchNuclearWar() должен быть доступен только на производстве, но не при тестировании) |
@RolesAllowed | X | X | Означает, что существует список ролей, позволяющих запускать заданный метод (или весь компонент) |
@DeclareRoles | X | Определяет роли для проверки безопасности | |
@RunAs | X | Временно назначает новую роль принципала |
Аннотация @RolesAllowed используется для того, чтобы указать, каким ролям будет доступен метод. Она может быть применена к конкретному методу или всему компоненту (в этом случае все бизнес-методы унаследуют эту роль компонента). Эта аннотация может принимать либо один экземпляр класса String (только одна роль может получить доступ к методу), либо массив экземпляров класса String (любая из ролей может получить доступ к методу). Аннотация @DeclareRoles, которую мы рассмотрим далее в этом разделе, может быть использована для объявления других ролей.
Аннотации безопасности (@RolesAllowed, @DenyAll и т. д.) являются частью спецификации Common Annotations 1.2 (JSR 250) и располагаются в пакете javax.annotation.security.
В листинге 8.5 показан класс ItemEJB, использующий аннотацию @RolesAllowed на уровне компонента и методов. Этот код указывает, что любой метод доступен принципалу, связанному с одной из следующих ролей: user, employee или admin. Метод deleteBook() переопределяет настройки уровня класса, открывая доступ только роли admin.
@Stateless
@RolesAllowed({"user", "employee", "admin"})
public class ItemEJB {
··@PersistenceContext(unitName = "chapter08PU")
··private EntityManager em;