Как роли и права переводятся в Spring Security?

В своих приложениях я обычно создаю три таблицы для управления доступом. Роли, Права и таблица ассоциаций, которая сопоставляет роли и права.

Я пытаюсь перевести этот подход на безопасность Spring, и после прочтения [этой статьи][1] мне показалось, что я на правильном пути. Я создал собственный AuthenticationProvider и реализовал authenticate() метод вроде так:

@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
    UserProfile profile = userProfileService.findByEmail(authentication.getPrincipal().toString());

    if(profile == null){
        throw new UsernameNotFoundException(String.format("Invalid credentials", authentication.getPrincipal()));
    }

    String suppliedPasswordHash = DigestUtils.shaHex(authentication.getCredentials().toString());

    if(!profile.getPasswordHash().equals(suppliedPasswordHash)){
        throw new BadCredentialsException("Invalid credentials");
    }

    UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(profile, null, profile.getAuthorities());

    return token;
}

profile.getAuthorities() Метод создает список прав (права заключены в моей собственной реализации GrantedAuthority). Итак, объект UsernamePasswordAuthenticationToken создается с этим списком. Это метод UserProfile.getGrantedAuthorities(), который заботится об этом:

public Collection<? extends GrantedAuthority> getAuthorities() {
    Set<ProduxAuthority> authorities = new HashSet<ProduxAuthority>();
    for (Role role : roles) {
        for (Right right : role.getRights()) {
            ProduxAuthority produxAuthority = new ProduxAuthority(right.getName());
            authorities.add(produxAuthority);
        }
    }
    return authorities;
}

У меня вопрос, правильный ли это подход? У меня складывается впечатление, что я должен вставлять роли в GrantedAuthorities вместо прав, но я хотел бы использовать права для защиты методов и URL-адресов, потому что это дает мне более точный контроль над авторизацией. Как бы я это сделал? И в чем разница между РОЛЕ и РАЗРЕШЕНИЕМ весной? Соответствуют ли разрешения правам и могу ли я использовать hasPermission() для защиты баз данных на правах вместо ролей?

1 ответ

Решение

Я снова отвечу на свой вопрос:

Spring не знает прав и разрешений, которые используются методом hasPermission, применяются только к относительно сложной доменной безопасности объекта /ACL в безопасности Spring. Простая система безопасности Spring знает только роли и роли или более общие "разрешения" (в общем смысле слова, не путать с разрешениями в безопасности объекта домена /ACL), например IS_AUTHENTICATED_ANONYMOUSLY, передается Spring в третьем параметре конструктора Authentication объекты.

Я суммировал все на своем собственном веб-сайте и создал пример реализации, который вставляет права в роли и таким образом все еще может быть довольно гибким.

http://en.tekstenuitleg.net/blog/spring-security-with-roles-and-rights

Другие вопросы по тегам