对于数据仓库中的 REST-API,我需要一些基于角色的数据访问。首先让我们通过一些小例子来阐明需求。我们定义实体 Author
和 Book
,两者都使用 PagingAndSortingRepository
作为其默认行为。一位作者可以“拥有”多本书,而一本书只能依赖于一位作者。
简化的实体应如下所示:
@Entity
@Table(name = "Author")
public class Author{
// [..]
@OneToMany(mappedBy = "author")
private List<Book> books;
}
@Entity
@Table(name = "Book")
public class Book{
// [..]
@ManyToOne
@JoinColumn(name = "Author_ID")
private Author author;
}
然后我定义两个角色User
和Admin
。通常作者是普通用户,因此授权机制只为角色User
添加一个SimpleGrantedAuthority
。但有一些特殊的作者还具有 Admin
角色。
当具有User
角色的普通作者调用url \books
时,他应该只获取他拥有的图书,而具有Admin
角色的作者应该获取所有存在的图书。此外,对于具有 User
角色的 PUT/PATCH/DELETE
请求作者,应该只能更新/删除自己的图书,而 Admin
角色则能够对所有图书执行此操作。
我的问题:有没有办法在Controller
类中定义一次数据访问?我从 Django-Framework 中知道类似的东西,我可以重写方法 get_queryset() ,该方法为每个“ View ”方法(GET/LIST/CREATE/UPDATE/等)提供了可使用的数据集。我目前存档的方法是在 Controller 中为不同的 API 端点定义方法,然后管理那里的访问。这会导致两个问题:
- 需要做很多工作来实现 Controller 中的方法
- 如果您的实体之间有很多依赖关系(我的 dwh 就是这种情况),您可能很容易错过某些端点。因此,我可能有一个端点,每个作者都拥有完全访问权限,无论哪个角色。
我认为这应该是一个常见问题,但我还没有找到常见的解决方案。所以我很感谢每一个建议。
<小时/>编辑:“安全方法”示例
@RequestMapping(value = "/dimensionAttributeValues", method = RequestMethod.GET)
@ResponseBody
public PagedResources<DimensionAttributeValue> getDimensionAttributeValues(Pageable pageable, PersistentEntityResourceAssembler persistentEntityResourceAssembler) {
Page<DimensionAttributeValue> result;
if (SecurityUtils.userHasRole(ADMIN) || SecurityUtils.userHasRole(TIMEMANAGER)) {
result = dimensionAttributeValueService.getAllDimensionAttributeValue(pageable);
} else {
result = dimensionAttributeValueService.getUserDimensionAttributeValue(SecurityContextHolder.getContext().getAuthentication().getName(), pageable);
}
PagedResources<DimensionAttributeValue> resources;
resources = this.toResource(result, persistentEntityResourceAssembler);
// TODO: Remove dirty Hack!
Link searchLink = linkTo(DimensionAttributeValueController.class).slash("/dimensionAttributeValues/search").withRel("search");
resources.add(searchLink);
return resources;
}
最佳答案
如果您想在存储库级别执行此操作,Spring Security 可以让您访问存储库中的主体。
无论如何,您都需要为此定义一个自定义查询。
类似于此处描述的内容:https://www.baeldung.com/spring-data-security在第3.2章中
否则,您可以添加服务层并使用@PreAuthorize
注释
关于java - Spring 启动: Data access depending on role,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57569809/