API中的主要數據信息和信息鏈接到項目(實體), 密碼流的好方法是:管理與項目鏈接的特定權限彈簧安全和OAuth2?Oauth2 /特定實體的密碼流/檢查權限
在這個程序,你得5微服務:
- UAA的microService:授權服務器
- 目錄的microService
- 訂購的microService
- 發票的microService
- 客戶的microService
變焦權限:
每個用戶都可以有很多項目,可以爲每個項目的權限:
- CAN_MANAGE_CATALOG
- CAN_VIEW_CATALOG
- CAN_MANAGE_ORDER
- CAN_VIEW_ORDER
- CAN_MANAGE_INVOICE
- CAN_VIEW_INVOICE
- ...
我有很多想法,但我不知道我有沒有好辦法:
使用例:我想securise端點:
http://catalog-service/{project_key}/catalogs
只有具有項目{project_key}的權限VIEW_CATALOG或MANAGE_CATALOG的USER纔可以列出所有當前目錄中的項目
我最初的想法:USE 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服務每次
二想法:USE USER_ROLE
隨着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)
的不便:同樣不方便在第二個想法
喜馬修,首先非常感謝您的回答,但我不知道你的鏈接或章節如何能幫助瞭解方法或解決此問題「將用戶角色映射到範圍」https://raymondhlee.wordpress.com/2014/12/21/implementing-oauth2-with-spring-security/。你有任何用例嗎? – timactive
這裏真正的訣竅是您希望在應用程序的不同區域使用細粒度的安全性。因此,您可以爲每個應用程序區域設置自定義範圍,然後將不同的用戶角色映射到不同的範圍。這將爲您提供非常細緻的控制,因爲您可以設置基本無限級別的組合,並將它們應用於不同的應用領域。 「實施你自己的規則,將範圍映射到角色」 –
好吧馬修,我認爲這只是一個基本的方案,這個例子沒有說明如何根據我的問題動態地定義一個特定的授權。示例ROLE_MANAGEPRODUCT_ {PROJECTKEY},項目鍵由用戶創建。 – timactive