【发布时间】:2016-10-10 16:56:39
【问题描述】:
我的API中的主要数据信息和信息链接到一个项目(Entity), 什么是密码流的好方法:使用 spring security 和 OAuth2 管理与项目相关的特定权限?
在这个应用程序中你有 5 个微服务:
- UAA 微服务:授权服务器
- 目录微服务
- 订购微服务
- 发票微服务
- 客户微服务
缩放权限:
每个用户可以拥有多个项目,并且可以拥有每个项目的权限:
- CAN_MANAGE_CATALOG
- CAN_VIEW_CATALOG
- CAN_MANAGE_ORDER
- CAN_VIEW_ORDER
- CAN_MANAGE_INVOICE
- CAN_VIEW_INVOICE
- ...
我有很多想法,但我不确定我是否有好的方法:
用例:我想保护端点:
http://catalog-service/{project_key}/catalogs
只有拥有项目 {project_key} 的 VIEW_CATALOG OR MANAGE_CATALOG 权限的 USER 才能列出项目中存在的所有目录
我的第一个想法:使用带有预授权的 ProjectAccessExpression
CatalogController.java
@Controller
public class CatalogController {
@PreAuthorize("@projectAccessExpression.hasPermission(#projectKey, 'manageCatalog', principal)" +
" or @projectAccessExpression.hasPermission(#projectKey, 'viewCatalog', principal)")
@RequestMapping(
value = "/{projectKey}/catalogs",
method = RequestMethod.GET,
produces = MediaType.APPLICATION_JSON_VALUE
)
public @ResponseBody List<Catalog> findByProject(@PathVariable("projectKey") String projectKey) {
return catalogService.find();
}
}
ProjectAccessExpression.java
@Component
public class ProjectAccessExpression {
private RestTemplate restTemplate;
public boolean havePermission(String projectKey, String permission , String username) {
Boolean havePermission = restTemplate.getForObject(String.format("http://uaa-service/permission/check?project=%1&permission=%2&username=%3",
projectKey, permission, username
), Boolean.class);
return havePermission;
}
}
不方便:每次都需要调用UAA服务
第二个想法:使用 USER_ROLE
使用用户角色
- 用户名 |角色
- mylogin1 | SHOP1.CAN_MANAGE_CATALOG
- mylogin1 | SHOP1.CAN_VIEW_CATALOG
- mylogin1 | SHOP2.CAN_MANAGE_CATALOG
- mylogin1 | SHOP2.CAN_VIEW_CATALOG
- mylogin1 | SHOP2.CAN_MANAGE_ORDER
- mylogin1 | SHOP2.CAN_VIEW_ORDER
- ...
SHOP1 是 SHOP2 是 projectKey
不方便:我不确定,但如果用户更改权限,我需要撤销所有令牌关联
第三个想法:在身份验证blob中添加特定权限
我不知道如何存储...
并在控制器中添加注释:
@PreAuthorize("@ProjectAccessExpression.hasPermission(authentication, 'manageCatalog||viewCatalog', #projectKey)
不方便:第二个想法同样不方便
【问题讨论】:
标签: java spring spring-security spring-boot spring-security-oauth2