在我的应用程序中,我有两个角色(admin
和 normal
)。在模型中我有类(示例):
public class Foo
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
public string Extra { get; set; }
}
用户还可以编辑该对象并使用过滤器进行搜索。应用程序基于带有 EF Core 的 WebAPI ASP.NET Core。
要求 normal
不应该看到(或用它做任何事情)Extra
属性。我应该通过拆分模型类(或其他东西)来保护应用程序(服务、 Controller 、数据访问层)中各处的数据,还是通过忽略属性来格式化端点输出?
我的想法之一是创建一个属性,将其放在 Extra
属性上,然后使用 ContractResolver
在用户没有资格查看时忽略具有该属性的属性属性(property)。同时修改 EF 更改跟踪器以忽略保存该属性(在相同情况下)。
是否有任何模式或策略来处理该问题?
最佳答案
没有用于此的内置机制,不,因为它太细化了。此外,尝试在 EF 级别强制执行此操作意味着将 HttpContext 泄漏到 DAL 中,出于多种原因,这不是一个好主意。
我最好的建议是使用继承对其进行建模。换句话说,创建如下内容:
public class Foo
{
[Key]
public int Id { get; set; }
public string Name { get; set; }
}
public class ExtraFoo : Foo
{
public string Extra { get; set; }
}
默认情况下, Entity Framework 将通过单表继承来实现这一点,因此您的支持表看起来几乎完全相同。但是,这使您能够单独使用一个或另一个。
然后,我建议使用完全独立的 Controller 和/或操作来处理每种类型。这允许您为每个人使用不同的授权,确保“普通”用户只能使用 Foo
(而不是 ExtraFoo
)。为了消除这暗示的明显重复,您可以使用一个使用泛型的基本 Controller ,然后每个特定类型的 Controller 都可以从中继承:
public class BaseFooController<TFoo> : Controller
where TFoo : Foo, new()
{
// all your actions here, utilizing generic type, e.g.:
[HttpPost]
public ActionResult Create(TFoo foo)
{
...
}
}
[Authorize(Roles = "normal")]
public class FooController : BaseFooController<Foo>
{
}
[Authorize(Roles = "admin")]
public class ExtraFooController : BaseFooController<ExtraFoo>
{
}
关于c# - 安全访问部分属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44927638/