Spring Security Tutorial Vol 9. Введение в компонент AccessDecisionManager

Spring

Девятый выпуск введения компонента AccessDecisionManager

Как последняя часть управления доступом, это действительно самая простая часть всего раздела главы.ConfigAttributeответственный за выражение правил,AccessDecisionVoterОтвечает за голосование по правилам, но разрешение на окончательный доступAccessDecisionManagerпринимая решения. В этом выпуске мы сосредоточимся на трех основных моделях принятия решений, представленных в Spring Security.

1. Описание интерфейса AccessDecisionManager

AccessDecisionManagerВыражение интерфейса очень простое, короче говоря, у него есть одна основная функция — принятие решения о текущих правилах доступа и о том, предоставлять ли права доступа. Будь то метод решения или метод поддержки,AccessDecisionManagerОн сам не завершает соответствующую логику, и им все управляется.AccessDecisionVoterСудите и казните по очереди. В соответствии с различными логическими правилами принятия решений в Spring Security существует три разных правила принятия решений.AccessDecisionManager, они соответственно:

  • AffirmativeBased
  • UnanimousBased
  • на основе консенсуса В настройках Spring Security по умолчанию, используяAffirmativeBased.
    AccessDecisionManager接口

Подробно о трехAccessDecisionManagerПеред реализацией класса разберемсяAccessDecisionManagerиAccessDecisionVoterотношения в рамках принятия решений. в дизайне рамыAccessDecisionManagerдаAccessDecisionVoterКласс коллекции управляет оценкой и голосованием по различным правилам.AccessDecisionVoterих. Но разница в том,AccessDecisionVoterКаждый из них будет голосовать только за те правила, которые поддерживает, например, когда для ресурса существует несколько правил параллельного доступа, они не могут голосовать за какое-то одно.AccessDecisionVoterГолосование является окончательным результатом авторизации доступа.AccessDecisionManagerОтветственностьAccessDecisionVoterОкончательное решение принимается по результатам голосования. В результате в структуре предустановлены три различных правила принятия решений.AccessDecisionManagerкласс реализации.

image.png

2. Один голос через AffirmativeBased

Первая, которую мы представим, модель решения о доступе, предоставляемая по умолчанию в Spring Security.AffirmativeBased. Одним словомAffirmativeBasedЛогикаодин голос—— В настоящее время, пока есть кто-то, кто проголосовал за форму утвержденияAccessDecisionVoterОкончательное разрешение будет предоставлено.

утвердительный прил Утвердительный; положительный н.

Предположим, что есть ресурс A, вRoleVoterТребуется роль администратора вMinutedOddVoterПропущенный доступен, пока это нечетная минута. затем вAffirmativeBasedВ соответствии с моделью его можно использовать для ролей без администратора сразу, при соблюдении условий нечетных минут можно получить доступ к целевым ресурсам.

    @Secured({"IS_AUTHENTICATED_FULLY","ROLE_USER","MINUTE_ODD"})
    @RequestMapping("/")
    public String root(@Autowired Authentication authentication) {
        return "index";
    }

Когда мы обращаемся к соответствующему ресурсу в нечетные минуты:

Voter: org.springframework.security.access.vote.RoleVoter@508280a4, returned: -1
Voter: org.springframework.security.access.vote.AuthenticatedVoter@2846f995, returned: -1
Voter: com.newnil.demo.security.MinuteBasedVoter@1ec9ec13, returned: 1
Authorization successful

Несмотря на тоRoleVoterиAuthenticatedVoterЕсть явное возражение, но посколькуMinuteBasedVoterУдовлетворить требования времени, то же самое даст положительный результат. Здесь есть опыт, по умолчаниюAffirmativeBasedподгонять под модельAccessDecisionVoterЕсли это не очень решающее правило, такое как некоторые вспомогательные ограничения доступа, избегайте подачи четкой формы одобрения, но с другой стороны, голосуйте однозначно против, и если вы не встретите возражений, вы можете воздержаться от голосования. Мы настроили в прошлом выпускеMinuteBasedVoterЭто плохой отрицательный учебный материал ^_^.

3. Вето одним голосом

Во-вторых, давайте введем альтернативное правило принятия решений, а именноUnanimousBasedСистема «один голос или представитель» не вызывает возражений со стороны всех.

единодушный прил Единодушный, единодушный, без возражений

Правила также очень просты для понимания, если любойAccessDecisionVoterПри отрицательном голосовании доступ не может быть предоставлен независимо от количества голосов «за».UnanimousBasedпредставляет сAffirmativeBasedСовершенно противоположные правила в чем-то похожи на систему «один голос или нет» из пяти постоянных голосов, как, например, знаменитая новость прошлых лет «Турция просила отменить право вето России в один голос, и это предложение было отклонено Один голос России». Также вернемся к коду, мы настраиваем код для использования, настраивая Java ConfigAccessDecisionManagerРеализация меняется наUnanimousBased.

@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)
@Configuration
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
    @Override
    protected AccessDecisionManager accessDecisionManager() {
        List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList();
        ExpressionBasedPreInvocationAdvice expressionAdvice = new ExpressionBasedPreInvocationAdvice();
        expressionAdvice.setExpressionHandler(this.getExpressionHandler());
        decisionVoters.add(new RoleVoter());
        decisionVoters.add(new AuthenticatedVoter());
        decisionVoters.add(new MinuteBasedVoter());
        return new UnanimousBased(decisionVoters);
    }
}

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

 Voter: org.springframework.security.access.vote.RoleVoter@ddc490, returned: 0
 Voter: org.springframework.security.access.vote.AuthenticatedVoter@27f66035, returned: 1
 Voter: com.newnil.demo.security.MinuteBasedVoter@4f6b68aa, returned: -1
Access is denied (user is not anonymous);

4. Меньшинство подчиняется большинствуНа основе консенсуса

последний раз игралConsensusBasedНаверное, самое «демократичное» из трех правил, то есть меньшинство подчиняется большинству.

консенсус н.ConsensusBasedголосовать за всехAccessDecisionVoterМнения суммируются, и результат партии с наибольшим количеством голосов имеет преимущественную силу. Но есть частный случай — равные голоса: если генерируются равные голоса, согласно конфигурацииallowIfEqualGrantedDeniedDecisionsчтобы определить, следует ли пройти, по умолчаниюallowIfEqualGrantedDeniedDecisionsзначение верно.

Точно так же мы модифицируем конфигурацию Java, чтобы проверитьConsensusBasedповедение:

@EnableGlobalMethodSecurity(prePostEnabled = true,securedEnabled = true)
@Configuration
public class MethodSecurityConfiguration extends GlobalMethodSecurityConfiguration {
    @Override
    protected AccessDecisionManager accessDecisionManager() {
        List<AccessDecisionVoter<? extends Object>> decisionVoters = new ArrayList();
        ExpressionBasedPreInvocationAdvice expressionAdvice = new ExpressionBasedPreInvocationAdvice();
        expressionAdvice.setExpressionHandler(this.getExpressionHandler());
        decisionVoters.add(new RoleVoter());
        decisionVoters.add(new AuthenticatedVoter());
        decisionVoters.add(new MinuteBasedVoter());
        ConsensusBased consensusBased = new ConsensusBased(decisionVoters);
        consensusBased.setAllowIfEqualGrantedDeniedDecisions(false);//可以调整平票逻辑
        return consensusBased;
    }
}

Мы также получаем доступ в четные минуты после входа в систему для доступа к ограниченным ресурсам:

Voter: org.springframework.security.access.vote.RoleVoter@2c1ae72c, returned: 1
Voter: org.springframework.security.access.vote.AuthenticatedVoter@60d5234, returned: 1
Voter: com.newnil.demo.security.MinuteBasedVoter@6a34393c, returned: -1
Authorization successful

с передUnanimousBasedПроизводительность отличается, потому что голосов одобрения больше, чем голосов против, поэтому мы, наконец, получили права доступа.

конец

Как последний компонент управления доступом, три правила принятия решений будут намного проще по сравнению с предыдущим предвидением и пониманием. и в обычном случае дляAccessDecisionManagerУ нас также вряд ли будет какая-либо возможность настройки. Нам просто нужно понять, как выбрать правильныйAccessDecisionManagerДостаточно написать соответствующий код конфигурации Java. В следующем выпуске мы перейдем к новой теме, чтобы представить некоторый контент о конфигурации в пакете конфигурации в Spring Security. Увидимся в следующий раз.