JAAS

Все что есть в http://jperm.wikia.com/wiki/%D0%91%D0%B5%D0%B7%D0%BE%D0%BF%D0%B0%D1%81%D0%BD%D0%BE%D1%81%D1%82%D1%8C_%D0%B2_Java так и работает.

С Java 1.3 появился JAAS и с Java 1.4 JAAS был включен в JavaSE.

JAAS позволяет работать не с кодоцентричной безопасностью, а в центр ставит пользователя. Во многих случаях это гораздо удобнее. Хотя, это можно было реализовать и на старой платформе.

В центр сатвится пользователь и уже JAAS предоставляет различные механизмы для аутентификации пользователю и позволяет подключать сторонние механизмы аутетнификации и назначать пользователям права.

Возможность подключать другие механизмы:
JAAS ничего нового не предложила и реализовала так называемый PAM - pluggable authentification modules - все возможные механизмы аутентификации включать в стандартную поставку неразумно. Решили включить стандартные и предоставить возможность подключать сторонние механизмы аутентификации.

В JAAS существует два понятия

subject - сущность, способная осущетсвлять действия (может быть как пользователь или как сервис)

Каждый субъект обладает набором principal - некоторый идентификатор, на основе которого принимается решение что допустимо какое-то действие или нет. Principal-ы формируются модулями аутентификации.

Так определяются права: grant класс_принципала "имя класса"

Пример файла политики
grant principal com.sun.security.auth.UnixPrincipal "scott" {   permission java.io.FilePermission "<>" }

Чтобы менеджер безопасности мог аутентифицировать пользователя, используется класс LoginContext, конструктор этого класса запроашивает строковый идентификатор контекста, записанный в конфигурационном файле jaas.

Пример: try { System.setSecurityMager (new SecurityManager); LoginContext context = new LoginContext("Login1"); Subject subject = context.getSubject; ..   // выполняем действия от имени субъекта context.logout;   // выходим }

Типичный файл конфигурации jaas с 2 модулями аутентификации

Login1{ com.sun.secuiryt.auth.module.UnixLoginModule required; com.whizzbang.auth.module.RetinScanModule sufficient; } Login2 { ...   }

Модули в стандартной поставке
В стандартную поставку входят:


 * UnixLoginModule
 * NTLoginModule
 * Krb5LoginModule
 * JndiLoginModule
 * KeyStoreLoginModule

Использование
Когда вызывается метод login у контекста, начинают по порядку вызываться методы login у объектов в каждом из классов (com.sun.suciryt.auth.module.Uni... ) причем, если выполнен login у модуля с аттрибутом required и он завершился неудачно, то процесс аутентификации завершается неудачно, если у поля required произошел удачно, то вызывается login у следующего метода.

Если аутентификация вызвана у модуля с аттрибутом sufficient и он удачный, то аутентификация завершается успешно.

Чтобы аутентификация прошла успешно, нужно чтобы хотябы один из модулей возвратил значение true,

Каждый из модулей аутентификации добавляет principal к subject.

Как выполнить действие от имени определенного субъекта?

Для этого у subject есть методы doAsPriviliged; и doAs;

doAs запускается в текущем контексте и в качестве параметра требует объект типа PriviligedAction. По сути PriviligedAction Должен реализовывать интерфейс в котором есть один метод - run и этот код будет выполняться от имени субъекта. doAsPriviliged отличается только указанием контектса безопасности (говорили выше). В том чилсе можно указать null, Subject.doAsPriviliged(subject, action, null); - subject - от имени кого выполняем action в контекстке null.

За счет того, что doAsPriviliged позволяет занулять контекст, его используют для разделения прав на уровне бизнес-логики и, например, доступа к данным.

Для того, чтобы можно было вызывать doAs и doAsPriviliged, код, который это делает, должен обладать полномочиями: permission javax.secuirty.auth.AuthPermission "CreateLoginContext.Login1"; permission javax.secuirty.auth.AuthPermission "doAsPriviliged"

Так же год должен обладать правами на просмотр user.*

Пример: System.setSecuirtyManager(new SecuirytManager): LoginContext context = new LoginContext("Login1"); context.login; Sybject su bject context.getSubject;

PrivilegedAction action - new SysPropAction("user.home");    // читает свойства java.home Object result = Subject.doAsPrivileged(subject,action,null); ... // выполняется действие

public SysPropAction (String propertyName) { } public Object run { return Sysmte.getPropery... // получаем свойство }

В файле политик коду надо дать разрешения grant codebase "file:login.jar" {   permission javax.secuirty.auth.AuthPermission "createLoginContext.Login1"; permission javax.secuirty.auth.AuthPermission "doAsPriviliged" } grant principal com.sun.security.auth.UnixPrincipal {   permission java.util.ProperyPermission "user.*", "read"; }

В jaas.config Login1{ com.sun. UnixLoginModule required; }

Для того, чтобы этот класс AuthTest скомпилировать и запустить: java -classpath "login.jar;prog.jar" -Djava.security.policy=AuthText.policy -Djava.security.auth.login.config=jaas.config AuthTest