Benim API'mdaki ana veri bilgileri ve bilgileri bir projeyle (Varlık) ilişkilendirilir, Şifre akışı için iyi yaklaşım nedir: Bir projeyle bağlantılı belirli bir izni yönetmek için bahar güvenliği ve OAuth2?Oauth2/Parola akış/belirli bir varlık için kontrol iznine
- UAA microservice: Bu uygulamada Eğer 5 mikro hizmetini sahip yetkilendirme sunucusu
- Katalog microservice
- Sipariş microservice
- Fatura microservice
- Müşteri microservice
Yakınlaştırma izni:
Her kullanıcı birçok projeyi olabilir ve her proje için izin olabilir:
- CAN_MANAGE_CATALOG
- CAN_VIEW_CATALOG
- CAN_MANAGE_ORDER
- CAN_VIEW_ORDER
- CAN_MANAGE_INVOICE
- CAN_VIEW_INVOICE
- ...
Birçok fikrim yok ama ben iyi bir yaklaşım olmasa eminim:
KULLANIMI DURUM: Ben son nokta SECURISE istiyorum:
http://catalog-service/{project_key}/catalogs
projesi {project_key} için izin VIEW_CATALOG VEYA MANAGE_CATALOG var
Sadece KULLANICI can Projenin
tüm katalog mevcut listelemek Benim ilk fikir: KULLANIM ProjectAccessExpression ön provizyon
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 ile.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;
}
}
sakıncalı: Her zaman
İkinci bir fikir için UAA telefon etmek zorunda olduğunu: USER_ROLE
- kullanıcı adı ile KULLANIM USER_ROLE
| 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 | .CAN_VIEW_ORDER SHOP2
- ...
SHOP1SHOP2 sakıncalı projectKey
olduğu i emin değilim ancak kullanıcı değişikliği izni varsa, ben bütün belirteç ortağa iptal gerekir
Üçüncü fikir: kimlik doğrulama bloğundaki belirli izni ekle
ben depolamak için nasıl bilmiyorum ...
Ve denetleyici bir açıklama
:@PreAuthorize("@ProjectAccessExpression.hasPermission(authentication, 'manageCatalog||viewCatalog', #projectKey)
sakıncalı: İkinci fikri aynı sakıncalı
Merhaba Matta, her şeyden önce Cevabınız için teşekkür ama bağlantı veya bölüm yaklaşımını bilmek nasıl yardımcı olabileceğini biliyor ya bu gidermezse "Kullanıcı Rollerini Kapsamlara Eşleme" sorusu https://raymondhlee.wordpress.com/2014/12/21/implementing-oauth2-with-spring-security/. Sen kullanma vaktin var mı? – timactive
Burada gerçek hile, uygulamanızın farklı alanları üzerinde ince taneli güvenlik istersiniz. Böylece, her uygulama alanı için özel kapsamlar ayarlayabilir ve ardından farklı kullanıcı rollerini farklı kapsamlara eşleyebilirsiniz. Bu, temel olarak sonsuz seviyedeki kombinasyonları kurabildiğiniz ve bunları farklı uygulama alanlarına uygulayabileceğiniz için çok ince taneli kontrol sağlayacaktır. "kapsamları rollere eşleme için kendi kurallarınızı uygulayın" –
Ok Matthew, sadece temel bir şema olduğunu düşünüyorum ve bu örnek, problemli olarak belirli bir yetkilendirmeyi dinamik olarak nasıl tanımlayacağımı göstermiyor. Örnek ROLE_MANAGEPRODUCT_ {PROJECTKEY}, proje anahtarı kullanıcı tarafından sonra oluşturulur. – timactive