2015-06-13 11 views
20

pracuję na systemie zarządzania treścią, który ma pięć antMatchers jak następuje:Wiele antMatchers w dziedzinie bezpieczeństwa wiosennym

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(); 

który rzekomo oznaczać, że zwiedzający mogą zobaczyć wszystkie strony w katalogu głównym (/ *) , a użytkownicy widzą tylko (/ user), administrator widzi tylko (/ admin), a są dwie strony logowania jedna dla użytkowników, a druga dla administratora.

Kod wydaje się działać dobrze, z wyjątkiem sekcji administracyjnej - nie działa, ale zwraca odmowę dostępu.

Odpowiedz

39

Wierzę, że problem jest w porządku swoich zasad:

.antMatchers("/admin/**").hasRole("ADMIN") 
.antMatchers("/admin/login").permitAll() 

Kolejność reguł spraw i bardziej szczegółowych przepisów powinien iść pierwszy. Teraz wszystko, co zaczyna się od /admin, będzie wymagało uwierzytelnionego użytkownika z rolą ADMIN, nawet ścieżki /admin/login (ponieważ /admin/login jest już dopasowana przez regułę /admin/** i dlatego druga reguła jest ignorowana).

Reguła dla strony logowania powinna zatem znajdować się przed regułą /admin/**. NA PRZYKŁAD.

.antMatchers("/admin/login").permitAll() 
.antMatchers("/admin/**").hasRole("ADMIN")