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] – создано slonopotamusjava_security [2019/06/12 16:08] (current) – external edit 127.0.0.1
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)