NHibernate 预选?
我正在尝试使用 NHibernate 实现权限,而我想要做的是,每次有一个 Select 查询时,检查返回类型是什么,如果它是启用安全的类型(例如发票),我想添加限制到 ICriteria 对象,以限制仅检索某些记录(根据用户是否已读取全部或读取自己的权限)。
我设法使用插入和更新实现这些权限,
NHibernater.Event.IPreUpdateEventListener
NHibernater.Event.IPreInsertEventListener
但不幸的是,在查询数据库后调用 IPreLoadEventListener
,因此这是浪费,因为过滤将在计算机上本地完成,而不是通过数据库。
有谁知道 NHibernate 是否提供了某种在执行查询之前调用的事件?
I am trying to implement privileges using NHibernate, and what I want to do, is each time there is a Select query, check what the return type is, and if it is a security enabled type (such as invoices) i want to add restrictions to the ICriteria object, to restrict retrieving only certain records (According if the user has read all, or read own privileges).
I managed to implement these kind of privileges for Insert and Update using
NHibernater.Event.IPreUpdateEventListener
NHibernater.Event.IPreInsertEventListener
but unfortunately the IPreLoadEventListener
is called after the database is queried, and therefore it is waste as the filtering will be done locally on the computer rather then by the database.
Does anyone know if NHibernate provides some sort of event that is called before a query is executed?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
如果您能够使用它,请查看 Rhino.Security 它的功能完全符合您的要求正在努力做。即使你无法使用它,你也可以看到他对这个问题的实现。
If you're able to use it, check out Rhino.Security It does exactly what you're trying to do. Even if you're unable to use it, you can then see his implementation of this problem.
你不能通过使用 Filter 来实现这一点吗?
更多信息可以在此处找到,
我已经使用过这个与我的项目中的拦截器结合使用:
我有一些实体,每个用户都可以从中创建实例,但只有创建它们的用户应该能够查看/修改这些实例。其他用户无法看到用户 X 创建的实例。
为此,我创建了一个接口
IUserContextAware
。 “用户上下文感知”的实体实现此接口。在构建会话工厂时,我创建了必要的过滤器:
完成后,我需要定义额外的过滤条件:
现在,每当我实例化
ISession
时,我都会指定某个拦截器应该是使用:此拦截器确保过滤器中的参数已填充:
Can't you achieve this by using Filters ?
More information can be found here
I've used this in combination with Interceptors in a project of mine:
I have some entities where each user can create instances from, but only the user who has created them, should be able to see / modify those instances. Other users cannot see instances created by user X.
In order to that, I've created an interface
IUserContextAware
. Entities that are 'user context aware' implement this interface.When building my session-factory, I created the necessary filters:
When this was done, I needed to define the additional filter criteria:
Now, whenever I instantiate an
ISession
, I specify that a certain interceptor should be used:This interceptor makes sure that the parameter in the filter is populated: