Лучший способ реализовать авторизацию для каждой группы в Spring Security - PullRequest
0 голосов
/ 21 июня 2020

Я пытаюсь найти лучший подход для авторизации определенных действий для пользователя на основе роли, которую он играет в группе. Например, у Питера есть роль администратора в группе A, поэтому он может исключать участников в группе A и роль участника в группе B, чтобы он мог читать контент только из группы B. так выглядит модель взаимоотношений групп пользователей . Есть ли лучший способ реализовать авторизацию, чем загрузка групповой роли в UserDetails, например:

(for (GroupUser groupuser: user.getGroupUsers()) {
   authorities.add(new SimpleGrantedAuthority('Group_'+groupuser.getId().getGroupId()+'_'+groupuser.getRole()));} 

1 Ответ

1 голос
/ 21 июня 2020

Это модель разрешений ABA C, решение о безопасности которой определяется не только информацией пользователя, но и состоянием / атрибутом защищенного ресурса.

С точки зрения безопасности Spring, это лучше всего реализовать с использованием @PreAuthorize / @PostAuthorize / @PostFilter, что позволяет вам использовать выражение SpEL для декларативного определения logi безопасности c, которое является выражением, которое будет окончательно оценивать на истину / ложь. В SpEL вы можете получить доступ к входному параметру и возвращаемому объекту метода, который выполняет тот прецедент, который вы хотите применить, или даже обратиться к компоненту Spring для вызова его метода для выполнения оценки.

Например, вы можете сделать что-то вроде:

@PreAuthorize("@authzService.isAllowToKickMember(principal , #userToKick)")
public void kickMemeber(User userToKick){
    
}


@Service
public class AuthzService{

    public boolean isAllowToKickMember(User currentUser , User userToKick){
        //check if current user can kick a given user
    }
}

Для указателей проверьте this .

...