【发布时间】:2012-01-24 01:05:12
【问题描述】:
背景
我们有一个使用 SQL Server 2008 R2 的带有实体框架 4.2 代码优先/FluentAPI 的 WinForms 应用程序。
安全性是IPrincipal 和IIdentity 的自定义实现,具有用户角色。显示表单/菜单/按钮时会检查这些角色,并将根据用户角色将其禁用/删除。
用户根据数据库进行身份验证,因此连接没有“主”用户:它是使用登录屏幕上提供的用户名/密码创建的。
因此,对数据(一般)的访问是有效的。
问题
但某些情况下可能需要我禁用对特定表或表内列的访问。
这里的一些测试表明,IGenericRepository.Find<MyCustomType>(_idToFind)(返回完整的实体)会失败,因为无法访问单个列并且 SQL 服务器会阻止整个 select 语句。
然而,我发现创建一个类似的查询
IGenericRepository.All<MyCustomType>().Select(_c => _c.JustASingleField)
会起作用,因为生成的查询只会查找我有权访问的特定字段。
问题
我有没有办法创建对数据库具有角色感知能力的查询?
例如:Find<MyCustomType>(id) 将照常返回对象,但用户无权访问的字段设置为 NULL 或没有值?
或者我只需要为每个不需要保护的项目编写“通用”查询并依赖安全系统来完全阻止对资源的访问?
另一个例子是填充一个网格,但用户无权访问的列将是空白的。
是否有可能使用实体框架?
【问题讨论】:
标签: security sql-server-2008 entity-framework-4