Настройка конфигурации безопасности работает следующим образом:
http
- это строитель (тип HttpSecurity
).
Когда вы Позвоните authorizeRequests()
, это даст вам 2-го строителя (ExpressionInterceptUrlRegistry
).
Когда вы позвоните antMatchers()
, это даст вам третьего строителя (AuthorizedUrl
).
Когда вы звоните permitAll()
, он возвращает вас второму строителю.
Это означает, что вы звоните accessDecisionManager()
на *Registry
строитель, а не AuthorizedUrl
строитель, то есть вызов является глобальным, не связанным с сопоставителем.
Ваши отступы неверны, и поэтому вы запутались:
.antMatchers("/my-filtered-url1", "/sub/my-filtered-url2/*")
.permitAll()
.accessDecisionManager(playerResourceDecisionManager())
Доступ Менеджер и его основные избиратели не несут ответственности за указание, какие правила доступа должны применяться к конкретному URL-адресу, что является заданием выражения доступа , примененного к AuthorizedUrl
, например
permitAll()
- сокращение от access("permitAll")
authenticated()
- сокращение от access("authenticated")
hasRole("ADMIN")
- сокращение от access("hasRole('ROLE_ADMIN')")
- * 106 2 *
hasAuthority("HASHSERIAL")
- Сокращение от access("hasAuthority('HASHSERIAL')")
. , .
Итак, если вы хотите, чтобы пользовательский AccessDecisionVoter
голосовал по определенным URL-адресам, то вы реализуете метод supports(ConfigAttribute attribute)
, чтобы избиратель распознал определенный атрибут, вы регистрируете избирателя. глобально, а затем укажите, что для определенных URL это необходимо:
.antMatchers("/my-filtered-url1", "/sub/my-filtered-url2/*")
.hasAuthority("HASHSERIAL")
class HashSerialSecurityVoter implements AccessDecisionVoter<Object> {
public boolean supports(ConfigAttribute attribute) {
if ((attribute.getAttribute() != null)
&& attribute.getAttribute().equals("HASHSERIAL")) {
return true;
}
else {
return false;
}
}
public boolean supports(Class<?> clazz) {
return true;
}
public int vote(Authentication authentication, Object object,
Collection<ConfigAttribute> attributes) {
// Your logic here
}
}