Какой тип проверки доступа к ресурсу на основе атрибутов лучше всего использовать на практике в Spring Security?

Допустим, есть ArticleService:

public interface ArticleService {
    ArticleResponseDTO delete(Long id);
    ArticleResponseDTO create(ArticleRequestDTO article);
    ArticleResponseDTO update(Long id, ArticleRequestDTO article);
    ArticleResponseDTO addComment(Long articleId, Long commentId);
    ArticleResponseDTO removeComment(Long articleId, Long commentId);
    List<ArticleResponseDTO> getAllByAuthor(Long authorId);
    ArticleResponseDTO getById(Long id);
    List<ArticleResponseDTO> getAll();
    List<ArticleResponseDTO> getAllByTitle(String title);
    List<ArticleResponseDTO> getAllByDate(String startDate, String endDate);

    Article get(Long id);
}

Допустим, нужно сделать PUT/POST/DELETE-запросы с кодом 200. Может сделать тот пользователь, который является автором статьи или админ.

Любой другой пользователь не сможет сделать некоторые запросы с чужой статьей (пользователь не может удалять/обновлять чужие статьи, только автор может).
Автор - пользователь, который имеет соответствующие связи в базе данных со статьями

Как сделать это?

Использовать @Secured не получится. А использовать @PreAuthorize следует на реализациях интерфейса. И использование @PreAuthorize нарушает принципы SOLID и делает код жестким, т.к. мне нужно через @имя_бина.

Пример:

 @Override
    @PreAuthorize("hasRole('ROLE_ADMIN') or ( (hasRole('ROLE_USER')  and @accessControlArticleServiceImpl.userHasAccessToArticle(authentication.principal.id, #id)))")
    public ArticleResponseDTO delete(Long id) {
        Article foundArticle = get(id);
        articleRepository.deleteById(id);
        return ArticleMapper.articleToArticleResponseDTO(foundArticle);
    }

А использовать все проверки в бизнес-логике или в методах сервиса кажутся не уместными. Может, есть альтернативные варианты с наилучшей практикой?

А с PermissionEvulator такая же история, если у меня есть несколько PermissionEvulator, мне нужно также жестко внедрять каждый бин в аннотации.


Ответы (0 шт):