EJB 3.1 - реализация javax.security.auth - PullRequest
3 голосов
/ 09 января 2012

Как я понимаю, javax.security.auth - это API для аутентификации и авторизации.

Я понимаю, что безопасность должна быть реализована провайдером контейнера, и провайдер бина может просто использовать его в своем бине, мои простые аннотации (@javax.annotation.security.RolesAllowed, @PermitAll и т. Д.) В соответствии с рекомендациями JSR.

Мой вопрос: это просто означает, что безопасность нельзя проверить без развертывания в контейнере. Есть ли способ использовать внешнюю 3-ю реализацию javax.security, которую можно каким-то образом внедрить в bean-компонент из теста, из которого можно также распространять и тестировать безопасность?

Это почти аналогичный подход, в котором мы внедряем реализацию JPA или внешнего менеджера транзакций из модульного теста в компонент для его тестирования.

П.С .: Я просто хочу проверить, возможно ли это, и если это возможно, это может открыть пути для какого-то другого развития. Я понимаю, что это тестирование можно легко выполнить, развернув компонент в встроенном контейнере, таком как OpenEJB или Arquillian.

1 Ответ

4 голосов
/ 10 января 2012

Во всем этом довольно много сантехники.Более хитрыми частями являются:

  • Обработка аннотаций и соблюдение правил ненаследования и переопределения (без ссылки на переопределение xml)
  • Обеспечение того, чтобы аннотации не использовались неправильно или применялись неправильно
  • Соблюдение xml и переопределение данных аннотации
  • Отображение "разрешенных ролей" с объявленными "ролями" (существует уровень косвенности)
  • Добавление всех метаданных в виде правильно отформатированных строк разрешений в JACCпровайдер
  • Обработка входа через правильно настроенный JAAS LoginModule
  • Некоторый творческий код для интеграции JAAS с JACC (стандартного способа сделать это не существует)
  • Отслеживание вашего субъекта через doAs вызывает или ThreadLocal
  • Проксирует все ваши объекты, чтобы вы могли выполнять проверки подлинности до фактического вызова методов
  • Изменение контекста безопасности для метода, аннотированного @RunAs, и обеспечение роли RunAsзаявленная роль
  • Работа с EJBContext.getCallerPrincipal()Subject есть много Principal objects, поэтому вам нужно выбрать один для возврата и убедиться, что вы можете выбрать один и тот же последовательно)
  • Подключение EJBContext.isCallerInRole(String) к провайдеру JACC
  • Убедитесь, что вы используете правильные классы исключений, когда выобрабатывать ошибки входа в систему, ошибки авторизации и другие различные условия

Так что делает контейнер.Работа, которую выполняют JAAS и JACC, действительно довольно мала.Конечно, не так подробно ориентированы, по крайней мере.

Ничто из этого не может быть действительно "введено", как вы могли надеятьсяПо сути, безопасность - это общий совет.

На первый взгляд, такие вещи, как безопасность на основе аннотаций, выглядят очень просто.Однако, когда вы исследуете все комбинации, предостережения и условия, это действительно складывается.Я помню все эти детали выше, потому что я все неправильно понял, когда мне впервые пришлось их реализовать.:) Слава Богу за TCK.

Я бы не советовал пытаться создать собственную структуру тестирования безопасности.

Если у вас есть какой-то конкретный способ, которым вы хотели бы, чтобы ваше тестирование происходилосамое разумное было бы просто поучаствовать в OpenEJB или Arquillian.

Все самые крутые возможности в OpenEJB исходили от боли пользователей и людей, которые рассказывали нам: «Мне больно, когда я так поступаю».Мы любим это.Это отличный источник возможностей, отличный способ привлечь новых участников и фантастический способ доказать идеи, которые могут быть полезны для внедрения в спецификацию (например, API-интерфейс Embedded EJBContainer в EJB 3.1).

Я могуДостаточно подчеркнуть, насколько важно участвовать в инновации, а не пытаться ее обойти.Если что-то не соответствует вашим потребностям, требуйте лучшего.

Это последнее утверждение в большей степени относится к миру в целом:)

...