我的开发框架是mvc3
我的想法是将每个action 以 {area}{Controller}{Action}格式保存在了数据库中,这样每个action都是唯一的,但后来发现action可以重载,所以不怎么准确
1.大家是怎么给action取标识存在数据库的呢?
假如存好了action,分配给了用户 或者 角色后
在验证的过程中 我是重写了AuthorizeAttribute ,里面实现了从数据库中获取权限数据,然后判断用户是否有权限访问当前Action ,这样实现了权限验证 ,但是,每一次操作都需要验证 ,所以每次操作都有额外的数据库访问操作 , 如果模块数 和用户数 角色数 都比较多,这应该很消耗资源吧?
2.请问大家是怎么验证权限的呢?
权限数据做缓存。
然后每个Action可以加注解(特性)
一个如楼上所说的可以做缓存,另一个,我想说的就是,别太小看数据库的性能。从数百万行数据里找几行数据,一般也就在10~20毫秒以内(你模块数和用户数一般不可能达到这么多吧)。在现阶段,以你的带宽和用户访问数量来看,直接在Attribute里面实现权限检查是可行的,性能这方面你不需要过分担心。
除了使用Attribute来作检查(比较安全),还有一个方法就是直接那那个操作的按钮(例如删除)给禁用也是一种办法。
所有的控制继承一个控制器,在继承的总控制器做权限控制,也就是你说的mvc的筛选器,实际上你可以把数据缓存起来,用权限菜单来控制权限,而不用每次是判断,第一次加载的时候都把你有的权限加载上来了,在菜单那控制好,缓存下数据就ok了
推荐你看看这个开源项目。给分吧
Anycmd是一个.net平台的完全开源的,完整支持RBAC的(包括核心RBAC、通用角色层次RBAC、静态职责分离RBAC和动态责任分离RBAC),将会支持xacml的通用的权限框架、中间件、解决方案。完整的RBAC规范所定义的能力只是anycmd所提供的能力集的一个子集。
权限系统干了什么?
给出一套方法,将系统中的所有功能标识出来,组织起来,托管起来,将所有的数据组织起来标识出来托管起来, 然后提供一个简单的唯一的接口,这个接口的一端是应用系统一端是权限引擎。权限引擎所回答的只是:谁是否对某资源具有实施 某个动作(运动、计算)的权限。返回的结果只有:有、没有、权限引擎异常了。