Несколько антиматчиков в Spring безопасности
Я работаю над системой управления контентом, у которой есть пять antMatchers, таких как:
http.authorizeRequests()
.antMatchers("/", "/*.html").permitAll()
.antMatchers("/user/**").hasRole("USER")
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/admin/login").permitAll()
.antMatchers("/user/login").permitAll()
.anyRequest().authenticated()
.and()
.csrf().disable();
которые предполагают, что посетители могут видеть весь сайт в корневом пути (/*), и пользователи могут видеть только (/user), администратор может видеть только (/admin), и есть два входа для входа один для пользователей и еще один для администратора.
Код, похоже, работает нормально, кроме раздела admin - он не работает, но возвращает исключение исключений.
Ответы
Ответ 1
Я считаю, что проблема заключается в порядке ваших правил:
.antMatchers("/admin/**").hasRole("ADMIN")
.antMatchers("/admin/login").permitAll()
Порядок правил имеет значение, и более конкретные правила должны идти первыми. Теперь все, что начинается с /admin
, потребует аутентифицированного пользователя с ролью ADMIN, даже пути /admin/login
(поскольку /admin/login
уже соответствует правилу /admin/**
, и поэтому второе правило игнорируется).
Следовательно, правило для страницы входа в систему должно идти до правила /admin/**
. Например.
.antMatchers("/admin/login").permitAll()
.antMatchers("/admin/**").hasRole("ADMIN")