Девятый выпуск введения компонента AccessDecisionManager
Как последняя часть управления доступом, это действительно самая простая часть всего раздела главы.ConfigAttribute
ответственный за выражение правил,AccessDecisionVoter
Отвечает за голосование по правилам, но разрешение на окончательный доступAccessDecisionManager
принимая решения.
В этом выпуске мы сосредоточимся на трех основных моделях принятия решений, представленных в Spring Security.
1. Описание интерфейса AccessDecisionManager
AccessDecisionManager
Выражение интерфейса очень простое, короче говоря, у него есть одна основная функция — принятие решения о текущих правилах доступа и о том, предоставлять ли права доступа. Будь то метод решения или метод поддержки,AccessDecisionManager
Он сам не завершает соответствующую логику, и им все управляется.AccessDecisionVoter
Судите и казните по очереди. В соответствии с различными логическими правилами принятия решений в Spring Security существует три разных правила принятия решений.AccessDecisionManager
, они соответственно:
- AffirmativeBased
- UnanimousBased
- на основе консенсуса
В настройках Spring Security по умолчанию, используя
AffirmativeBased
.
Подробно о трехAccessDecisionManager
Перед реализацией класса разберемсяAccessDecisionManager
иAccessDecisionVoter
отношения в рамках принятия решений.
в дизайне рамыAccessDecisionManager
даAccessDecisionVoter
Класс коллекции управляет оценкой и голосованием по различным правилам.AccessDecisionVoter
их.
Но разница в том,AccessDecisionVoter
Каждый из них будет голосовать только за те правила, которые поддерживает, например, когда для ресурса существует несколько правил параллельного доступа, они не могут голосовать за какое-то одно.AccessDecisionVoter
Голосование является окончательным результатом авторизации доступа.AccessDecisionManager
ОтветственностьAccessDecisionVoter
Окончательное решение принимается по результатам голосования. В результате в структуре предустановлены три различных правила принятия решений.AccessDecisionManager
класс реализации.
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.
Увидимся в следующий раз.