我有一个基于dotnet核心+ entityframework核心,身份服务器和MS SQL Server构建的web应用程序作为数据库(前端的Angular 2)。我已经用角色实现了用户身份验证。现在我正在使用Authorize属性来控制对我的应用程序的不同部分的访问。这里我们有一个api函数的例子可用于3个不同的角色:
[Authorize(Roles = "ProductAdministrator, WebEditor, Manager")]
public IActionResult Get()
{
IList<Product> products = _service.GetProducts();
return Ok(products);
}
如果您的用户没有这些角色,那么您将无法访问此产品列表。
我现在面临的问题是我工作的客户希望能够控制对每个Product对象的角色访问。创建时,可能应该为对象分配某种标准的角色集。但是“admin”用户应该能够控制对每个对象/实体的访问。
例如,我们可以让这个对象具有一些角色:
var carProduct1 = new Product() {
Name = "Volvo XE 90",
Category = "Car",
Price = 51.600,
Roles = ["CarSeller", "ProductAdministrator", "Insurance", "VolvoExpert"]
};
然后这可能是另一个对象
var carProduct2 = new Product() {
Name = "Ford Fiesta",
Category = "Car",
Price = 15000,
Roles = ["ProductAdministrator", "CarDealer", "FordExpert", "CarWorkshop"]
};
你现在可能已经明白了。如何才能最好地控制路由级别的访问权限到对象级别?是否有任何关于此的文章(我的谷歌搜索没有成果)?
答案 0 :(得分:2)
将权限概念从\\u041e\\u043f\\u0438\\u0441\\u0430\\u043d\\u0438\\u0435 \\u0442\\u043e\\u0432\\u0430\\u0440\\u0430
中抽象出来。您可能希望稍后将权限应用于其他对象。
Product
public interface IPermissionProtected
{
string[] AllowedGroups { get; }
}
是允许的实体。
Product
也许在您创建public class Product : IPermissionProtected
{
...
public Product(..., string[] allowedGroups)
{
this.AllowedGroups = allowedGroups;
}
public string[] AllowedGroups { get; private set;}
}
时指定了权限。没有什么可以阻止你以后更改这些权限。
Product
您可以允许任何人访问var carProduct1 = new Product(new [] {"CarSeller", "ProductAdministrator", "Insurance", "VolvoExpert"}) {
Name = "Volvo XE 90",
Category = "Car",
Price = 51.600
};
控制器。从这一点来看,我不清楚你想要如何准确地去,但是,例如,你只能返回当前用户有权限的产品。
Product
您也可以拥有此
public IActionResult Get()
{
IList<Product> products = _service.GetProducts(currentUserRole);
return Ok(products);
}
您可以修改public IActionResult Get(int productId)
{
try
{
Product product = _service.GetProduct(productId, currentUserRole);
return Ok(product);
}
catch (AuthorizationException ex)
{
return NotAuthorized(ex);
}
}
以向您提供用户有权使用的产品。
Service