当前位置:编程学习 > C#/ASP.NET >>

C/S程序 操作权限怎么解决

C/S程序,功能操作权限,也就是客户操作权限,大家都是怎么解决的?

我想到的方法,第一种方式是:
窗体中的角色——按钮做一个映射,然后用显隐的方式,但是感觉这种方式不好,不够灵活,并且添加一个窗体,就要把窗体中的按钮都加到数据库中,再与每一个角色做一个映射。

第二种方式:控制业务层的方法,验证业务层的每一个方法是否有权限,也就是验证业务层每个表的增、删、改、查是否有权限,如果涉及到多表操作,就要先验证每个表的权限,然后在执行表操作。

这个问题大家都是怎么解决的,欢迎讨论。灌水没分 --------------------编程问答-------------------- 差不多是这2个理念 --------------------编程问答-------------------- 数据库加权限关系表。。。 --------------------编程问答-------------------- 精确到 每个 按钮?
很强大
一般是 针对 某一项大功能。
没做过这么细的,
都是把窗体 作为一个功能, 然后数据库中存着 菜单列表
相应权限 对象 N个菜单列表
登录的时候 读取这些菜单 没权限的菜单 不读  动态帮顶 dll 就行了 --------------------编程问答-------------------- 第二种方式:控制业务层的方法,验证业务层的每一个方法是否有权限,也就是验证业务层每个表的增、删、改、查是否有权限,如果涉及到多表操作,就要先验证每个表的权限,然后在执行表操作。


这个方法 --------------------编程问答-------------------- 角色,模块,用户熟悉权限控制
用户角色不同,权限不同
如同管理者与工作人员
从属关系救是所属部门的关系
细粒度的权限管理
根据“业务逻辑”的独特权限需求,编码实现细粒度部分
用户组
角色组
权限分1可执行 2可读 3可写 等
--------------------编程问答-------------------- 做到模块基本上就行了。除非项目有特殊要求。

做那么细,到时候你会发现,维护成本太高,而且用户不一定会用 --------------------编程问答-------------------- 回3楼,控制窗体其实是菜单权限,如果更细些,例如某角色只有查看+添加功能,某角色有 查看+添加+修改+删除功能,这个就要控制到具体的一个操作了 --------------------编程问答-------------------- --------------------编程问答-------------------- 需要看你的业务需要 --------------------编程问答-------------------- 感谢各位的回复

jrl5365:我也在考虑使用第二种方式,但是现在设计中,怕存在没有考虑到的情况,最终满足不了客户需要,那么就会出现很多问题,第一种方式的确太笨了,但是肯定能够实现,也不会存在大问题。所以听取大家意见。

wuyq11的回复,细粒度权限现在只差这个权限了,数据权限、字段权限都实现了

uvvvw:这个是客户要求的 --------------------编程问答--------------------
引用 7 楼 xiaomianao 的回复:
回3楼,控制窗体其实是菜单权限,如果更细些,例如某角色只有查看+添加功能,某角色有 查看+添加+修改+删除功能,这个就要控制到具体的一个操作了


支持第一种,加上上边说的,更显得这样清晰简单了。只有两个角色(权限组)么,其他的都是用户组(机构关系)。

产品就是要关系用户体验,对用户透明,每次都告诉他没权限岂不郁闷。
程序员的价值就是为了提高效率节省资源。有很多单位用软件一开就是一天到一月不等,每次操作都要判断就显得麻烦了。 --------------------编程问答-------------------- 最好是1、2两种都要,并不冲突
--------------------编程问答-------------------- 用第二种方式,但是可以直接把当前用户所有权限取出,放入datatable
使用时候先判断datatable --------------------编程问答-------------------- 第二种方法更灵活
一般我是做的第二种方法 --------------------编程问答--------------------   我一般也是用第二种方法,只不过我有一个疑问,就是权限表本就控制了一些功能权限,就像某些菜单能操作,某些菜单不能操作,那么如何动态的限制增删改的权限呢。。也就是所谓的“细粒化”?
  以前我的做法是没次点击一些按钮的时候再根据业务需要去判断,看是否有删除或者修改的权限,但是这样我觉得很繁琐。。 --------------------编程问答-------------------- --------------------编程问答--------------------
引用 14 楼 huangwanhai 的回复:
第二种方法更灵活
一般我是做的第二种方法


更?灵活在哪了。 是该关心需求还关心系统结构,看来大多数还是更关心实现。其实域、用户组、角色、系统配置已经有成熟的共识了。现在可讨论的就是项目需求,拿别的项目来套总有不合适。 --------------------编程问答-------------------- 可以设置权限树,页面就是父节点,这个页面中的按钮就是子节点,根绝分配的权限去判断当前用户是否具有操作某些按钮的权限。  【用户表】  和【权限表】  其中用户表中保存用户的ID 和权限(权限是以权限编码1,权限编码2.....)形式保存的。 --------------------编程问答-------------------- 回johndii:控制UI的按钮方式的确更直观,用户有哪些功能在界面上直接体现,但是我们要为每一个用户配置UI按钮权限,并且新增界面,又要把界面上的按钮在数据库中对应创建一条记录,并为每个人配置权限,多麻烦。如果使用第二种方式,可以通过AOP的方式,使用代理类,结构也清晰。但是第二种方式也存在一个问题,例如某人在页面点击添加,是可以弹出创建窗体的,填写完好多内容,但是点击保存,弹出“你没有添加××的权限!”,用户肯定崩溃了,“我好不容易填写了那么多内容,你才告诉我不让太添加,这程序太蠢了吧”。也许  danjiewu  说的很对,两者并不冲突 --------------------编程问答-------------------- "我们要为每一个用户配置UI按钮权限,并且新增界面,又要把界面上的按钮在数据库中对应创建一条记录,并为每个人配置权限"

多次提到每一个人,角色是权限的集合不是用户组,在你7楼的留言中只看到类似普通用户、管理员两个角色。

还是那句话,不清楚你们的项目需求。如:并且新增界面,又要。。。这是实现中走了弯路吧跟结构无关,猜测猜测。

--------------------编程问答-------------------- http://hi.csdn.net/attachment/201008/19/6671441_1282194887uWMh.jpg

随便画画,也许非典。 --------------------编程问答-------------------- 回johndii,谢谢,你说的理解,19L说错了,“并且新增界面,又要把界面上的按钮在数据库中对应创建一条记录,并为每个角色配置权限”才对。

你觉得上面修改后的这句话不对吗?“这是实现中走了弯路吧跟结构无关”想问的就是这个你是怎么解决的。。。请教

--------------------编程问答-------------------- 也就是是用什么好办法,不走弯路,能让UI中的功能(按钮)与角色映射 --------------------编程问答-------------------- 只需根据用户表中的一个权限字段来做出相应的操作。 --------------------编程问答-------------------- 无他,唯映射而已!! --------------------编程问答-------------------- 分开写,正如吴老师说的那样 --------------------编程问答-------------------- 谁是吴老师? --------------------编程问答-------------------- 学习学习哦 --------------------编程问答--------------------
引用 15 楼 zyl_leilei 的回复:
我一般也是用第二种方法,只不过我有一个疑问,就是权限表本就控制了一些功能权限,就像某些菜单能操作,某些菜单不能操作,那么如何动态的限制增删改的权限呢。。也就是所谓的“细粒化”?
  以前我的做法是没次点击一些按钮的时候再根据业务需要去判断,看是否有删除或者修改的权限,但是这样我觉得很繁琐。。

我是这样 把页面也细化 每个页面都调用那个通用的判断权限的方法 --------------------编程问答--------------------
引用 20 楼 johndii 的回复:
"我们要为每一个用户配置UI按钮权限,并且新增界面,又要把界面上的按钮在数据库中对应创建一条记录,并为每个人配置权限"

多次提到每一个人,角色是权限的集合不是用户组,在你7楼的留言中只看到类似普通用户、管理员两个角色。

还是那句话,不清楚你们的项目需求。如:并且新增界面,又要。。。这是实现中走了弯路吧跟结构无关,猜测猜测。

做一个控件表
Act_Id Act_Name 
另用户表
User_Id User_Name ...
权限表
Right_Id Act_Id User_Id 
用权限表来判断
不知哪位有更好的见解   --------------------编程问答--------------------
引用 6 楼 uvvvw 的回复:
做到模块基本上就行了。除非项目有特殊要求。

做那么细,到时候你会发现,维护成本太高,而且用户不一定会用


嗯  都是做到模块的  
很多时候 一个功能有多个菜单和按钮可以促发   一般都是设置 模块 enable或者 disable

可以在数据库里面 设置一个账号表 里面添加 权限字段  32位 不同位代表不同模块是否可用 --------------------编程问答-------------------- 有人共享一个简单的例子就好了 --------------------编程问答-------------------- 给登录的用户加权限设定不就行了,
添加角色管理
--------------------编程问答-------------------- 呵呵,現在在弄這個 --------------------编程问答-------------------- 重新上图:
--------------------编程问答-------------------- 你也可以参考:
实现业务系统中的用户权限管理--设计篇

--------------------编程问答-------------------- 10101111100
1表示有此权利
0表示无此权利 --------------------编程问答-------------------- 最近我自己写了两个权限管理组件
一个复杂的,可以定义到每一个操作权限,但需要用户表、角色表、权限表,及两量映射的三个表
原理,无论是按钮还是菜单,都先判断当前登录用户是否有权限,再设置显/隐,可用性
登录时加载用户的权限列表,对应权限表的多条权限字符传如:"X页面打印",“添加新闻"
在每一个你写的界面里load时,设置按钮和菜单的可见或可用性:
//判断权限的方法public bool Isright("X页面打印");
this.btn_print.Enable=Isright("X页面打印");
this.btn_news_add.visbleIsright("添加新闻");



一个简单的,仅仅需要一个用户表搞定,用户表里有用户名、密码、角色名
然后再每页load时;
if(当前用户的角色名="管理员")
{
 各种按钮和菜单的设置
}
if(当前用户的角色名="查询"))
{
 各种按钮和菜单的设置
} --------------------编程问答-------------------- 分为三个级别:
1 模块级别:用户没权限时无法访问整个模块,比如菜单上直接看不到入口。
2 界面元素级别:又可分为两块
2.1 不同用户看到的界面布局不同,比如看得到/看不到某个按钮
2.2 查询结果不同,比如同一个查询操作A用户可以看到全部内容,但B用户只能看到一个子集。
3 操作级别:比如用户提交一个操作,之后判断是否有权限,没有权限的话否决该操作。

权限信息的记录方式:
大体上分文 用户-角色-对象,这个对象可以是模块、界面元素、记录访问级别、操作。
记录的表比较多,用户表、角色表、对象表、模块表、操作表、界面元素表等等,但还有一个总表,用json方式记录了前面表里的综合数据。
客户端启动后获取对应的json配置并常驻内存,之后的操作权限直接在本地访问这些配置串处理,不用再访问数据库。

对于上面级别3,是在BLL判断的,和LZ说的一样。
这里说下2.2的问题,这个目前没想出什么高效的方式,处理上分两种:
1 具体逻辑具体判断:比如A用户能访问所有商户记录,B只能访问注册资金10W以下的商户的记录,对于这种查询,权限配置上只建立了一个对应的“查询”对象,而具体实现由一个查询逻辑工厂提供,是代码实现的,对于每个查询需要单独实现。
2 数据库记录配置:在数据库对应查询表有一个权限字段,记录了该记录能够被查询的对应权限(的ID),程序查询时添加一个条件,将权限信息送过去匹配这个字段,不匹配的就查不到了。但这个方法要求数据库每一行都有权限这个字段,而且这个字段的变更限制很多,不容易调整。 --------------------编程问答-------------------- 学习学习。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,