java_security
Differences
This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revisionLast revisionBoth sides next revision | ||
java_security [2007/02/09 12:08] – slonopotamus | java_security [2007/04/10 10:39] – slonopotamus | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | [[start|На главную]] | ||
- | ====== Реализация системы безопасности в Java ====== | ||
- | Всё нижеописанное исходит из предположения что в Sun хорошо подумали когда | ||
- | проектировали пермишены, | ||
- | |||
- | |||
- | ===== О чём это вообще ===== | ||
- | В типичном веб-приложении далеко не каждый пользователь может менять любые данные. У кого-то есть доступ только на чтение, | ||
- | ==== Что защищать ==== | ||
- | Любые данные. | ||
- | ==== Зачем защищать ==== | ||
- | Чтобы разделять, | ||
- | |||
- | |||
- | ===== Аутентификация ===== | ||
- | ==== Несортированный трэш ==== | ||
- | <code java> | ||
- | // | ||
- | Policy.setPolicy(new Policy() | ||
- | { | ||
- | public boolean implies(final ProtectionDomain domain, final Permission permission) | ||
- | { | ||
- | for (final Principal principal : domain.getPrincipals()) { | ||
- | if (principal instanceof MyPrincipal) { | ||
- | // | ||
- | } | ||
- | } | ||
- | return false; | ||
- | } | ||
- | }); | ||
- | // | ||
- | final Configuration orig = Configuration.getConfiguration(); | ||
- | Configuration.setConfiguration(new Configuration() | ||
- | { | ||
- | public AppConfigurationEntry[] getAppConfigurationEntry(final String name) | ||
- | { | ||
- | return (name.equals(" | ||
- | new AppConfigurationEntry[]{ | ||
- | new AppConfigurationEntry( | ||
- | " | ||
- | AppConfigurationEntry.LoginModuleControlFlag.REQUISITE, | ||
- | Collections.< | ||
- | ) | ||
- | } : orig.getAppConfigurationEntry(name); | ||
- | } | ||
- | |||
- | public void refresh() | ||
- | { | ||
- | orig.refresh(); | ||
- | } | ||
- | }); | ||
- | System.setSecurityManager(new SecurityManager()); | ||
- | // | ||
- | final String name = " | ||
- | final String password = " | ||
- | final LoginContext ctx = new LoginContext(" | ||
- | { | ||
- | public void handle(final Callback[] callbacks) throws IOException, | ||
- | { | ||
- | 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(), | ||
- | { | ||
- | public Object run() | ||
- | { | ||
- | //Do something | ||
- | return null; | ||
- | } | ||
- | }); | ||
- | ctx.logout(); | ||
- | </ | ||
- | |||
- | ===== Авторизация ===== | ||
- | |||
- | ==== Краткое описание проверки пермишена ==== | ||
- | В Java существует [[http:// | ||
- | |||
- | * Проверяется, | ||
- | * Если равен, то считается что действие разрешено делать. | ||
- | * Вызывается [[http:// | ||
- | * Берётся текущий '' | ||
- | * '' | ||
- | * Берётся текущая '' | ||
- | |||
- | ==== Компоненты системы авторизации ==== | ||
- | |||
- | * [[http:// | ||
- | * [[http:// | ||
- | * [[http:// | ||
- | * [[http:// | ||
- | |||
- | |||
- | ==== Внедрение своих правил авторизации ==== | ||
- | |||
- | |||
- | === Principal === | ||
- | |||
- | Скорее всего у вас в приложении есть класс '' | ||
- | |||
- | == Примерная реализация == | ||
- | <code java> | ||
- | public class UserPrincipal implements java.security.Principal { | ||
- | // ------------------------------ FIELDS ------------------------------ | ||
- | /** | ||
- | * Константа для незарегистрированного пользователя. | ||
- | */ | ||
- | private static final UserPrincipal nullUserPrincipal = new UserPrincipal (null); | ||
- | private final User user; | ||
- | |||
- | // -------------------------- STATIC METHODS -------------------------- | ||
- | |||
- | public static UserPrincipal getPrincipal (final User user) { | ||
- | return user == null ? nullUserPrincipal : new UserPrincipal (user); | ||
- | } | ||
- | |||
- | // --------------------------- CONSTRUCTORS --------------------------- | ||
- | |||
- | protected UserPrincipal (final User user) { | ||
- | super (); | ||
- | this.user = user; | ||
- | } | ||
- | |||
- | // ------------------------ CANONICAL METHODS ------------------------ | ||
- | |||
- | public boolean equals (final Object obj) { | ||
- | if (obj == null || !(obj instanceof UserPrincipal)) { | ||
- | return false; | ||
- | } | ||
- | final UserPrincipal o = (UserPrincipal) obj; | ||
- | final User myUser = this.getUser (); | ||
- | final User oUser = o.getUser (); | ||
- | if (myUser == null && oUser == null) { | ||
- | return true; | ||
- | } else if (myUser != null && oUser != null) { | ||
- | return myUser.equals (oUser); | ||
- | } else { | ||
- | return false; | ||
- | } | ||
- | } | ||
- | |||
- | public int hashCode () { | ||
- | return this.getClass ().hashCode () + (this.user == null ? 13 : this.user.hashCode ()); | ||
- | } | ||
- | |||
- | // ------------------------ INTERFACE METHODS ------------------------ | ||
- | |||
- | // --------------------- Interface Nullable --------------------- | ||
- | |||
- | public boolean isNull () { | ||
- | return this.user == null; | ||
- | } | ||
- | |||
- | // --------------------- Interface Principal --------------------- | ||
- | |||
- | public String getName () { | ||
- | return this.getClass ().getName () + " " + (this.user == null ? " | ||
- | } | ||
- | |||
- | // -------------------------- OTHER METHODS -------------------------- | ||
- | |||
- | public User getUser () { | ||
- | return this.user; | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | |||
- | === Policy === | ||
- | '' | ||
- | |||
- | > **ВНИМАНИЕ** Считается, | ||
- | |||
- | |||
- | |||
- | === Собираем вместе === | ||
- | |||
- | == Установка Policy == | ||
- | <code java> | ||
- | Policy.setPolicy (new MyPolicy ()); | ||
- | </ | ||
- | |||
- | == Включение SecurityManager' | ||
- | <code java> | ||
- | if (System.getSecurityManager () != null) { | ||
- | System.setSecurityManager (new SecurityManager ()); | ||
- | } | ||
- | </ | ||
- | |||
- | == Вызов защищённого кода == | ||
- | <code java> | ||
- | try { | ||
- | final Subject subject = ...; | ||
- | final T result = Subject.doAs (subject, new PrivilegedExceptionAction< | ||
- | public Object run () throws IOException, | ||
- | // | ||
- | } | ||
- | }); | ||
- | } catch (PrivilegedActionException e) { | ||
- | ... | ||
- | } | ||
- | </ | ||
- | |||
- | == SecurityUtils == | ||
- | Пара методов для удобства. | ||
- | |||
- | <code java> | ||
- | public final class SecurityUtils { | ||
- | public static boolean hasPermission (final Permission permission) { | ||
- | try { | ||
- | checkPermission (permission); | ||
- | return true; | ||
- | } catch (final SecurityException e) { | ||
- | return false; | ||
- | } | ||
- | } | ||
- | |||
- | public static void checkPermission (final Permission permission) throws SecurityException { | ||
- | if (System.getSecurityManager () != null) { | ||
- | System.getSecurityManager ().checkPermission (permission); | ||
- | } | ||
- | } | ||
- | } | ||
- | </ | ||
- | |||
- | |||
- | ===== Альтернативы ===== | ||
- | * [[http:// | ||
- | FIXME | ||
- | |||
- | ===== Permissions Evangelizm ===== | ||
- | FIXME |
java_security.txt · Last modified: 2019/06/12 16:08 by 127.0.0.1