Получите еще одно разрешение в разрешении - Spring security - PullRequest
0 голосов
/ 21 июня 2020

Я использую Spring security для своего проекта, и это моя конфигурация.

protected void configure(HttpSecurity http) throws Exception {

        http.
                authorizeRequests()
                    .antMatchers("/home").hasRole("USER")
                    .antMatchers("/edit-information/**").hasRole("USER")
                    .antMatchers("/admin/**").hasAnyRole("ADMIN_STAFF","ADMIN_MANAGER")
                    .antMatchers("/admin/employee").hasRole("ADMIN_MANAGER")
                    .and()
                .formLogin()
                    .loginPage("/home/login")
                    .loginProcessingUrl("/j_spring_security_check")
                    .usernameParameter("email")
                    .passwordParameter("password")
                    .defaultSuccessUrl("/",true)
                    .failureUrl("/home/login-fail")
                    .and()
                .exceptionHandling()
                    .accessDeniedPage("/403");
    }

Так что это моя идея. Я хочу, чтобы все ADMIN могли войти в систему на /admin/**, но в /admin/** у меня /admin/employee. Я просто хочу, чтобы роль ADMIN_MANAGER могла войти только здесь. Но .antMatchers("/admin/**").hasAnyRole("ADMIN_STAFF","ADMIN_MANAGER") уже разрешено ADMIN_STAFF войти в /admin/employee. Я пытался добавить .antMatchers("/admin/employee").hasRole("ADMIN_MANAGER"), но не вышло!

1 Ответ

2 голосов
/ 21 июня 2020

Я действительно считаю, что проблема в заказе на antMatchers. Порядок правил имеет значение, и более конкретное c должно быть первым, поэтому вместо этого:

.antMatchers("/admin/**").hasAnyRole("ADMIN_STAFF","ADMIN_MANAGER")
.antMatchers("/admin/employee").hasRole("ADMIN_MANAGER")

Вы можете попробовать следующее:

.antMatchers("/admin/employee").hasRole("ADMIN_MANAGER")
.antMatchers("/admin/**").hasAnyRole("ADMIN_STAFF","ADMIN_MANAGER")
...