Spring Загрузка: accessDeniedHandler не работает

124
18

У меня есть следующая конфигурация безопасности Spring:


@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/api/private/**", "/app/**").authenticated();
http.csrf().disable();
http.logout().logoutSuccessUrl("/");
http.exceptionHandling().accessDeniedPage("/403"); //.accessDeniedHandler(accessDeniedHandler);
}
}


Я ожидаю следующую логику: не аутентифицированные пользователи будут перенаправлены на /403. Вместо этого Spring отображает страницу Tomcat 403 по умолчанию. Я также пробовал пользовательский accessDeniedHandler с большим успехом.


Как я могу реализовать пользовательскую логику при сбое доступа?

спросил(а) 2021-01-19T14:11:20+03:00 2 месяца, 3 недели назад
1
Решение
173

AccessDeniedHandler применяется только к аутентифицированным пользователям. Поведение по умолчанию для пользователей, не прошедших проверку подлинности, - это перенаправление на страницу входа (или что-то, что подходит для используемого механизма аутентификации).


Если вы хотите изменить это, вам нужно настроить AuthenticationEntryPoint, который вызывается, когда пользователь, не прошедший проверку подлинности, пытается получить доступ к защищенному ресурсу. Вы должны иметь возможность использовать

http.exceptionHandling().authenticationEntryPoint(...)

вместо того, что у вас есть. Подробнее см. API-документы.

ответил(а) 2021-01-19T14:11:20+03:00 2 месяца, 3 недели назад
61

Обычное поведение Spring "Безопасность" - перенаправление пользователей, не прошедших проверку подлинности, на вашу страницу входа в систему, как описано ниже. Аутентификация пользователей, которые не авторизованы (не имеют роли ADMIN), будут перенаправлены на страницу отказа в доступе:


http.authorizeRequests().antMatchers("/admin/**")
.access("hasRole('ADMIN')")
.and().formLogin().loginPage("/login")
.and().exceptionHandling().accessDeniedPage("/403");

Если вы внедрили свой собственный механизм проверки подлинности, и вы не рассчитываете на конфигурацию безопасности Spring для доставки пользователей, не прошедших проверку подлинности, на страницу входа в систему, вы можете выполнить игру в конфигурации Spring Security следующим образом - для обслуживания вашей пользовательской страницы 403 вместо реальной страницы входа:


http.authorizeRequests().antMatchers("/admin/**")
.access("hasRole('ADMIN')")
.and().formLogin().loginPage("/403")
.and().exceptionHandling().accessDeniedPage("/403");

ответил(а) 2021-01-19T14:11:20+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема