User Tools

Site Tools


java_security

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Next revision
Previous revision
java_security [2007/02/09 11:46]
slonopotamus создано
java_security [2019/06/12 16:08] (current)
Line 13: Line 13:
 Чтобы разделять,​ кому что можно, а кому что нельзя делать. Чтобы разделять,​ кому что можно, а кому что нельзя делать.
  
-===== Краткое описание проверки пермишена ​=====+ 
 +===== Аутентификация ===== 
 +==== Несортированный трэш ==== 
 +<code java> 
 +    //​Authorization init 
 +    Policy.setPolicy(new Policy() 
 +    { 
 +      public boolean implies(final ProtectionDomain domain, final Permission permission) 
 +      { 
 +        for (final Principal principal : domain.getPrincipals()) { 
 +          if (principal instanceof MyPrincipal) { 
 +            //​получить откуда-то коллекцию прав принципала и вызвать для них implies, передав в качестве аргумента проверяемый пермишен. 
 +          } 
 +        } 
 +        return false; 
 +      } 
 +    }); 
 +    //​Authentication init 
 +    final Configuration orig = Configuration.getConfiguration();​ 
 +    Configuration.setConfiguration(new Configuration() 
 +    { 
 +      public AppConfigurationEntry[] getAppConfigurationEntry(final String name) 
 +      { 
 +        return (name.equals("​MY_APP"​)) ? 
 +            new AppConfigurationEntry[]{ 
 +                new AppConfigurationEntry( 
 +                    "​com.myApp.security.MyLoginModule",​ //наша реализация LoginModule. 
 +                    AppConfigurationEntry.LoginModuleControlFlag.REQUISITE,​ 
 +                    Collections.<​String,​ Object>​emptyMap() 
 +                ) 
 +            } : orig.getAppConfigurationEntry(name);​ 
 +      } 
 + 
 +      public void refresh() 
 +      { 
 +        orig.refresh();​ 
 +      } 
 +    }); 
 +    System.setSecurityManager(new SecurityManager());​ 
 +    //​Аутентификация 
 +    final String name = "​login";​ 
 +    final String password = "​password";​ 
 +    final LoginContext ctx = new LoginContext("​MY_APP",​ new CallbackHandler() 
 +    { 
 +      public void handle(final Callback[] callbacks) throws IOException,​ UnsupportedCallbackException 
 +      { 
 +        for (final Callback cb : callbacks) 
 +        { 
 +          if (cb instanceof NameCallback) 
 +          { 
 +            ((NameCallback) cb).setName(name);​ 
 +          } 
 +          else if (cb instanceof PasswordCallback) 
 +          { 
 +            ((PasswordCallback) cb).setPassword(password.toCharArray());​ 
 +          } 
 +          else 
 +          { 
 +            throw new UnsupportedCallbackException(cb);​ 
 +          } 
 +        } 
 +      } 
 +    }); 
 +    ctx.login();​ 
 +    //​выполнение кода в контексте аутентифицированного пользователя 
 +    Subject.doAs(ctx.getSubject(),​ new PrivilegedAction<​Object>​() 
 +    { 
 +      public Object run() 
 +      { 
 +        //Do something 
 +        return null; 
 +      } 
 +    }); 
 +    ctx.logout();​ 
 +</​code>​ 
 + 
 +===== Авторизация ===== 
 + 
 +==== Краткое описание проверки пермишена ====
 В Java существует [[http://​java.sun.com/​j2se/​1.5.0/​docs/​guide/​security/​spec/​security-specTOC.fm.html|встроенный механизм прав]]. В Java существует [[http://​java.sun.com/​j2se/​1.5.0/​docs/​guide/​security/​spec/​security-specTOC.fm.html|встроенный механизм прав]].
  
Line 23: Line 101:
   * Берётся текущая ''​Policy'',​ у которой вызывается метод [[http://​java.sun.com/​j2se/​1.5.0/​docs/​api/​java/​security/​Policy.html#​implies(java.security.ProtectionDomain,​ java.security.Permission)|Policy#​implies(java.security.ProtectionDomain,​ java.security.Permission)]] с данным ''​ProtectionDomain''​ом.   * Берётся текущая ''​Policy'',​ у которой вызывается метод [[http://​java.sun.com/​j2se/​1.5.0/​docs/​api/​java/​security/​Policy.html#​implies(java.security.ProtectionDomain,​ java.security.Permission)|Policy#​implies(java.security.ProtectionDomain,​ java.security.Permission)]] с данным ''​ProtectionDomain''​ом.
  
-===== Компоненты системы авторизации ​=====+==== Компоненты системы авторизации ====
  
   * [[http://​java.sun.com/​j2se/​1.5.0/​docs/​api/​java/​lang/​SecurityManager.html|SecurityManager]] - просто фасад над всей системой прав.   * [[http://​java.sun.com/​j2se/​1.5.0/​docs/​api/​java/​lang/​SecurityManager.html|SecurityManager]] - просто фасад над всей системой прав.
Line 31: Line 109:
  
  
-===== Внедрение своих правил авторизации ​=====+==== Внедрение своих правил авторизации ====
  
  
-==== Principal ​====+=== Principal ===
  
 Скорее всего у вас в приложении есть класс ''​User''​. Нужно будет написать реализацию ''​Principal'''​а для него (Внимание! Не надо делать так чтобы ваш ''​User''​ реализовывал ''​Principal'''​а,​ т.к. отсутствие юзера не означает отсутствие ''​Principal'''​а). Скорее всего у вас в приложении есть класс ''​User''​. Нужно будет написать реализацию ''​Principal'''​а для него (Внимание! Не надо делать так чтобы ваш ''​User''​ реализовывал ''​Principal'''​а,​ т.к. отсутствие юзера не означает отсутствие ''​Principal'''​а).
  
-=== Примерная реализация ​===+== Примерная реализация ==
 <code java> <code java>
 public class UserPrincipal implements java.security.Principal { public class UserPrincipal implements java.security.Principal {
Line 106: Line 184:
  
  
-==== Policy ​====+=== Policy ===
 ''​Policy''​ - это как раз то, куда надо всовывать свой код, чтобы делать проверку прав по своей базе, а не по стандартной реализации в policy-файле. Делается это просто - пишется свой класс, наследующийся от ''​Policy''​ (внимание,​ если в вашем приложении права могут динамически изменяться,​ то надо переопределять метод ''​implies'',​ т.к. в стандартной реализации он активно занимается кэшированием пермишенов. ''​Policy''​ - это как раз то, куда надо всовывать свой код, чтобы делать проверку прав по своей базе, а не по стандартной реализации в policy-файле. Делается это просто - пишется свой класс, наследующийся от ''​Policy''​ (внимание,​ если в вашем приложении права могут динамически изменяться,​ то надо переопределять метод ''​implies'',​ т.к. в стандартной реализации он активно занимается кэшированием пермишенов.
  
Line 113: Line 191:
  
  
-==== Собираем вместе ​====+=== Собираем вместе ===
  
-=== Установка Policy ​===+== Установка Policy ==
 <code java> <code java>
 Policy.setPolicy (new MyPolicy ()); Policy.setPolicy (new MyPolicy ());
 </​code>​ </​code>​
  
-=== Включение SecurityManager'​а ​===+== Включение SecurityManager'​а ==
 <code java> <code java>
 if (System.getSecurityManager () != null) { if (System.getSecurityManager () != null) {
Line 127: Line 205:
 </​code>​ </​code>​
  
-=== Вызов защищённого кода ​===+== Вызов защищённого кода ==
 <code java> <code java>
 try { try {
Line 141: Line 219:
 </​code>​ </​code>​
  
-=== SecurityUtils ​===+== SecurityUtils ==
 Пара методов для удобства. Пара методов для удобства.
  
Line 170: Line 248:
 ===== Permissions Evangelizm ===== ===== Permissions Evangelizm =====
 FIXME FIXME
 +
 +====== JAAS vs Acegi Security ======
 +
 +===== Java Security (JAAS) =====
 +{{jsf-ru:​plus.gif}} Является стандартом,​ поддерживается большим количеством технологий (EJB, Servlets, etc)
 +
 +{{jsf-ru:​plus.gif}} Простой API
 +
 +{{jsf-ru:​plus.gif}} Хорошо документирован
 +
 +{{jsf-ru:​minus.gif}} Довольно скудная базовая функциональность
 +
 +{{jsf-ru:​minus.gif}} Ограниченное встроенное кэширование (не предполагает изменения набора прав в процессе работы приложения),​ в случае отключения которого необходимо реализовывать кэширование на уровне приложения
 +
 +{{jsf-ru:​minus.gif}} Отсутствуют теги для проверки прав к различным элементам интерфейса (однако возможно их написание)
 +
 +{{jsf-ru:​minus.gif}} Политики принятия решений необходимо реализовывать вручную
 +
 +{{jsf-ru:​minus.gif}} В некоторых случаях контейнеро-зависим (однако возможно написание контейнеро-независимого кода)
 +
 +
 +
 +===== Acegi Security =====
 +
 +{{jsf-ru:​plus.gif}} Хорошо документирован
 +
 +{{jsf-ru:​plus.gif}} Простая интеграция со Spring
 +
 +{{jsf-ru:​plus.gif}} Встроенные аудиты
 +
 +{{jsf-ru:​plus.gif}} Встроенные интерцепторы (например,​ для удаления из коллекций недоступных объектов)
 +
 +{{jsf-ru:​plus.gif}} Различные политики принятия решений (если все полиси разрешают,​ если хоть одна полиси разрешает,​ на основе голосования и очков)
 +
 +{{jsf-ru:​plus.gif}} Встроенные теги для проверки прав к различным элементам интерфейса (правда примитивные)
 +
 +{{jsf-ru:​plus.gif}} Встроенное кэширование
 +
 +{{jsf-ru:​plus.gif}} Контейнеро-независим
 +
 +{{jsf-ru:​plus.gif}} Встроенная поддержка опции «запомнить меня»
 +
 +{{jsf-ru:​plus.gif}} Множество адаптеров для различных механизмов аутентификации
 +
 +{{jsf-ru:​minus.gif}} Многократно более сложный API
 +
 +{{jsf-ru:​minus.gif}} Не специфицирован
 +
 +При этом следует учитывать,​ что имеется возможность оборачивать использование сторонним кодом JAAS’а в обращения к Acegi и наоборот. Так же необходимо понимать,​ что права виртуальной машины (доступ к файлам,​ сокетам,​ работа с класслоадерами и т.д. проверяются через JAAS, поэтому при использовании Acegi в любом случае будет необходимо направлять в него обращения к JAAS).
java_security.1171021618.txt.gz · Last modified: 2019/06/12 16:11 (external edit)