Подтвердить что ты не робот

Несколько антиматчиков в 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 - он не работает, но возвращает исключение исключений.

4b9b3361

Ответ 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")