
在有些应用系统中,比如银行应用系统中,每个客户都有自己的数据领域(例如账户信息、交易历史),仅靠 Spring Security 中的传统基于角色的安全机制(例如 ROLE_USER、ROLE_ADMIN)本身不足以在数据层面实施访问控制。
Spring Security 中基于角色的访问控制非常适合以下场景:• 授予对功能区域的访问权限(例如,只有管理员才能访问管理员控制面板)。• 根据用户的角色允许或拒绝方法或端点。但您的需求需要基于所有权的访问控制,或者对象级别的安全性,而不仅仅是角色级别的。
如何在 Spring Security 中满足“仅访问自己的领域”这一要求?
你需要将基于角色的安全性与细粒度的基于所有权的授权逻辑相结合。
下面一步一步看看我们怎么进行将基于Role的安全与控制更进一步,完成每个人只能访问自己的领地:
1、标准的认证与角色设置
@GetMapping("/brands/{id}/categories")
public List<CategoryDTO> listCategoriesByBrand(@PathVariable(name = "id") Integer brandId) throws BrandNotFoundException{
List<CategoryDTO> listCategories = new ArrayList<>();
Brand brand;
try {
brand = bservice.get(brandId);
Set<Category> categories = brand.getCategories();
for(Category category: categories) {
CategoryDTO dto = new CategoryDTO(category.getId(), category.getName());
listCategories.add(dto);
}
return listCategories;
} catch (BrandNotFoundException e) {
throw new BrandNotFoundException("");
}
}