В настоящее время я изучаю инфраструктуру весенней безопасности - пока что это здорово, впечатлило.Однако я не выяснил, где и как определить наследование разрешений.
Например, я хочу, чтобы ROLE_ADMIN имел как минимум те же права, что и ROLE_USER.Я определил три intercep-url для весны:
<intercept-url pattern="/auth/login.do" access="permitAll"/>
<intercept-url pattern="/voting/*" access="hasRole('ROLE_USER')"/>
<intercept-url pattern="/admin/*" access="hasRole('ROLE_ADMIN')"/>
Когда я пытаюсь получить доступ к любому сайту, вложенному из / голосование /, когда вошел в систему как пользователь ROLE_ADMIN, мне отказывают.Я что-то здесь упускаю?Я знаю, что мог бы определить несколько ролей для ветви / голосования / *, но если я представляю, что у меня может быть 10 разных пользовательских ролей в одном из моих реальных сценариев использования, я могу представить, что файл .xml будет очень запутанным, действительнобыстро.
Можно ли где-нибудь настроить наследование ролей?
ура
РЕДАКТИРОВАТЬ:
Благодаря большому сообществу и их вкладу, я нашел рабочее решение - это может быть хороший стиль или нет - оно работает: D
Я определил перечисление, которое отражает наследуемые роли Spring-Sec:
public enum UserRoles {
ROLE_USER(new String[]{"ROLE_USER"}),
ROLE_ADMIN(new String[]{"ROLE_USER", "ROLE_ADMIN"});
private final String[] roles;
private UserRoles(String[] roles) {
this.roles = roles;
}
public String[] getRoles() {
return roles;
}
}
Затем я реализовал свой собственный UserDetailsService:
В методе
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException, DataAccessException { ... }
, где речь идет о добавлении предоставленных прав доступа к UserDetail, я получаю соответствующее значение перечисления идобавьте все роли, определенные этим значением перечисления:
List<GrantedAuthority> authList = new ArrayList<GrantedAuthority>(2);
for (String role : UserRoles.ROLE_ADMIN.getRoles()) {
authList.add(new GrantedAuthorityImpl(role));
}
UserDetails user = null;
try {
//user = new User(username, md5.hashPassword(username), true, true, true, true, authList);
} catch (NoSuchAlgorithmException ex) {
logger.error(ex.getMessage(), ex);
}
Мой объект домена, который сохраняется, содержит поле @Enumerated с UserRole - в реальной среде это поле загружается из БД и соответствуетng Роли выбраны из этого перечисления.
еще раз спасибо за вклад - люблю это сообщество ^^