Spring Security - доступ на основе владения - PullRequest
0 голосов
/ 03 июля 2019

Допустим, у меня есть минимальный контроллер RESTful, подобный следующему, кстати, используя Java 8 и Spring Boot 2, ...

@RestController
class MyController {

    @Autowired
    private PostService service;    

    @GetMapping
    public Post get() {

        return service.getLatest();
    }
}

Я успешно защитил этот маршрут с помощью Spring Securityмодуль.Теперь я хочу разрешить только владельцу ресурса доступ к этому ресурсу.Под владельцем ресурса я подразумеваю создателя или просто говорю:

Post myPost = new Post();
...
myPost.getCreator().equals(currentUser); // Should be true when access is granted

Я многое узнал о доступе на основе ролей, но почти ничего о проверке владения ... Конечно, я мог бы поместить оператор if внутриконтроллер и выбрасывать исключение, но я намеревался использовать что-то вроде Spring Access Контроль доступа на основе выражений .

Есть еще идеи?У кого-нибудь есть хорошая идея или пример для проверки владения ресурсом?

Ответы [ 2 ]

0 голосов
/ 03 июля 2019

Для простой операции get вы можете просто вернуть сообщение, связанное с вашим текущим зарегистрированным пользователем

@GetMapping
public Post getPost(Authentication authentication) {
    return service.getPostByUser(authentication.getName());
}

Для обновления существующего сообщения вы можете проверить в PreAuthorize, является ли создатель вошедшим в систему пользователем. authentication.getName () возвращает письмо в моем примере

@PutMapping
@PreAuthorize("#post.getCreator() == authentication.getName()")
public void update(@RequestBody Post post, Authentication authentication) {
    service.updatePost(post);
}

Базовый пример пути @Component

@Autowired
private CreatorCheck creatorCheck;

@PutMapping
@PreAuthorize("@creatorChecker.check(#post,authentication)")
public void update(@RequestBody Post post, Authentication authentication) {
    service.updatePost(post);
}

И компонент. Может быть расширен для извлечения исходного сообщения и проверки этого создателя.

@Component
public class CreatorCheck {

    public boolean check(Post post, Authentication authentication) {
       return post.getCreator().equals(authentication.getName());
    }
}

Более подробное руководство можно найти в этом руководстве ссылка, найденная 0x1C1B

0 голосов
/ 03 июля 2019

В ролевом подходе роли предопределены независимо от ответа / ресурса.Но в вашем случае нам нужно сначала получить ресурс, чтобы проверить, является ли пользователь владельцем или нет.Мы не можем принять решение заранее.

Допустим, если у пользователя есть ROLE_ADMIN, он будет администратором для всех ресурсов.В вашем случае право собственности зависит исключительно от ресурсов.Советую сходить с ручной if проверкой.Если объект Post тяжелый, вы можете поддерживать отдельную таблицу с двумя столбцами resource_id и owner.затем, если владелец совпадает, вы можете получить ресурс позже, иначе вы можете отправить 403 запрещенного ответа пользователю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...