определение пользовательских ролей с наследующими правами - PullRequest
2 голосов
/ 06 июня 2011

В настоящее время я изучаю инфраструктуру весенней безопасности - пока что это здорово, впечатлило.Однако я не выяснил, где и как определить наследование разрешений.

Например, я хочу, чтобы 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 Роли выбраны из этого перечисления.

еще раз спасибо за вклад - люблю это сообщество ^^

Ответы [ 2 ]

4 голосов
/ 06 июня 2011

Извлечение RoleHierarchy и RoleHierarchyImpl и этот вопрос .

1 голос
/ 06 июня 2011

Насколько я знаю, Spring Security не поддерживает концепцию ролей и привилегий. В Spring безопасность - это только роли, которые иногда называют полномочиями. Более того: в Spring Security это роли / полномочия, которые в системе ролей и привилегий называются привилегиями.


Так что, если вы хотите создать Систему ролей и привилегий, вам нужно сделать это самостоятельно, создав собственный Spring AuthenticationManager и использовать роли / полномочия Spring Security, такие как Права.

@ См. Этот блог: Настройка Spring Security (Часть 1 - Настройка UserDetails или расширение GrantedAuthority) - Он написан для Spring Security 2.0 и показывает, как реализовать то, о чем я говорю. Также остается, что у RoleHierarchy есть некоторые недостатки, но эта статья о 2,0, может быть, недостатки ушли в 3,0

...