С использованием
@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser("dba").password("root123").roles("ADMIN","DBA");
мой пример работает нормально. Например для
http.authorizeRequests()
// ...
.antMatchers("/db/**").access("hasRole('ADMIN') and hasRole('DBA')")
.and().formLogin()
.and().exceptionHandling().accessDeniedPage("/Access_Denied");
Если я изменил inMemoryAuthentication на spring jdbc по умолчанию, у меня возникла проблема с ролью.
@Autowired
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource);
Я уверен, что настроил базу данных и схему, используя весенние рекомендации (чтобы иметь возможность использовать аутентификацию jdbc по умолчанию).
В режиме отладки я вижу результат загрузки из БД в
org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl
#loadUserByUsername(username)[line 208]
return createUserDetails(username, user, dbAuths);
Он возвращает аналогичный результат с конфигурацией памяти:
org.springframework.security.core.userdetails.User@183a3:
Username: dba;
Password: [PROTECTED];
Enabled: true;
AccountNonExpired: true;
credentialsNonExpired: true;
AccountNonLocked: true;
Granted Authorities: ADMIN,DBA
Как видите, он загружает соответствующие предоставленные полномочия, но http-запрос перенаправляет меня на .accessDeniedPage("/Access_Denied"). Я запутался, потому что он должен работать для пользователя, как раньше.
Я не использую весеннюю загрузку в своем проекте. Мои журналы не содержат никакой конфигурации ошибок jdbc. Я потратил много времени на изучение деталей, и мои идеи только что закончились. Как вы думаете, мне нужно добавить, чтобы создать какие-то библиотеки кеша или что-то еще?
ROLE_
(префикс роли по умолчанию). То же самое касаетсяhasRole('ADMIN')
, который также проверит, имеет ли переданная роль префикс, если нет, он будет добавлен. У вашего пользователя есть полномочияADMIN
, а неROLE_ADMIN
, поэтому проверка не удалась. Либо используйтеhasAuthority
вместоhasRole
(и изменитеroles
наauthorities
в вашем образце в памяти), либо добавьте к полномочиям в базе данных префиксROLE_
, либо измените префикс роли по умолчанию на пустой вместоROLE_
. - person M. Deinum   schedule 09.03.2016