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

JavaEE тоже использует JAAS, но не на прямую.

Вводятся новые понятия:

группа - множество пользователей, имеющих общие характреристики и определенные в сервере приложений. Отличие от роли: группа определена на уровне сервера приложений и может использоваться во многих веб-приложений, в то время как роли создаются для конкретных веб-приложений.

realm (область, сфера, домен) - домен политики безопасности. Определяет набор пользователей и групп, если они есть. В серверах приложений аутентификация и авторизация всегда происходит в доменах политики безопасности (каждый домен характеризуется как хранит логины и пароли)

роль - абстрактное имя полнамочия для доступа к спецефическому набору ресурсов приложений. (Понятие роли идентично principal)

Для совмещения группы в сервере приложений и роли в конкрентном приложении, производится маппинг через специальный файл развертывания. У каждого сервера он свой. У glassfish от можут быть glassfish-web.xml. В этом файле должен быть элемент security-role-mapping:   DIRECTOR> ...  

В JavaEE callbackHandler, написанный для консольных приложений, самостоятельно не делается. Обычно его реализует веб-контейнер.

Аутентификацию осуществляет LoginModule, который с теми же самыми параметрами реализует initialize, login, commit, abort, ... Но ключевое отличие в том, что callback-объект создается не прикладным программистом, а веб-контейнером и должен вернуть имя пользователя и пароль, которые потом нужно будет проверить. Затем из БД или еще откуда выбираются роли и добавляются к субъекту как к principal.

Веб-контейнер может провести аутентификацию 4 методами BASIC, DIGEST, FORM, CLIENT-CERT и какой именно будет использоваться настраивается в web.xml

Пример для login-form:  FORM    ...

Веб-контейнер получает информацию и ч.з. элементы колбека передает в модуль аутентификации и добавляются роли субъекты.

Модуль логина указывается в jaas.config, а какой именно файл jaas.config надо использовать указывается в параметрах для запуска программы. Например, для Tomcat: -Djava.secuiryt.auth.login.config. Для Tomcat это будет один файл на все приложения.

Авторизация в JavaEE
В JavaSE мы просто писали файл .policy. В JavaEE Доступ разрешается или запрещается по URI

Для организации автороизации в веб-приложении необходимо:


 * 1) идентифицировать группу веб-ресурсов (к которым применяются правила)
 * 2) идентифицировать роли (кому что можно)
 * 3) отобразить коллекции веб-ресурсов в роли
 * 4) идентифицировать пользователей с каждой из ролей

Определение коллекций осущществляется в web.xml      - название коллекции /adm/*        - шаблон <http-method>GET <http-method>POST </web-resource-collection>

<auth-constraint>                               - список доступа. Если в <auth-constraint> пусть, то никто доступа иметь не будет, а если его не будет вообще, то с коллекцией смогут работать все. <role-name>admin</role-name> </auth-constraint>

<user-data-constrаint>           -- может содержаться и определяет как будут передаваться параметры

</secuirty-constraint>

В user-data-constraing может встречаться NONE - нет ограничений на передачу данных INTEGRAL - удовлетвориться, что данные не изменялись CONFIDENTIAL - приватные

Все что выше описано - декларативные методы, но есть (хотя редко используются), программные методы управления авторизацией в HttpServletRequest: String getRemoteUser(0 - возвращает пользователя если он аутентифицирован getUserPrincipal - возвращает объект Principal, который содержит имя (идентификатор) в зависимости от которого можно разрешить доступ куда-то или нет.

Набито в Etherpad