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

xiaomianao 2010-08-19 09:07:02
C/S程序,功能操作权限,也就是客户操作权限,大家都是怎么解决的?

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

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

这个问题大家都是怎么解决的,欢迎讨论。灌水没分
...全文
358 40 打赏 收藏 转发到动态 举报
写回复
用AI写文章
40 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzz9413 2011-08-06
  • 打赏
  • 举报
回复
最近我自己写了两个权限管理组件
一个复杂的,可以定义到每一个操作权限,但需要用户表、角色表、权限表,及两量映射的三个表
原理,无论是按钮还是菜单,都先判断当前登录用户是否有权限,再设置显/隐,可用性
登录时加载用户的权限列表,对应权限表的多条权限字符传如:"X页面打印",“添加新闻"
在每一个你写的界面里load时,设置按钮和菜单的可见或可用性:
//判断权限的方法public bool Isright("X页面打印");
this.btn_print.Enable=Isright("X页面打印");
this.btn_news_add.visbleIsright("添加新闻");



一个简单的,仅仅需要一个用户表搞定,用户表里有用户名、密码、角色名
然后再每页load时;
if(当前用户的角色名="管理员")
{
各种按钮和菜单的设置
}
if(当前用户的角色名="查询"))
{
各种按钮和菜单的设置
}
langmanlaowo 2011-08-06
  • 打赏
  • 举报
回复
10101111100
1表示有此权利
0表示无此权利
沐NeMo 2011-08-06
  • 打赏
  • 举报
回复
沐NeMo 2011-08-06
  • 打赏
  • 举报
回复
重新上图:
沐NeMo 2011-08-06
  • 打赏
  • 举报
回复
呵呵,現在在弄這個
wangxiao2008 2011-08-06
  • 打赏
  • 举报
回复
给登录的用户加权限设定不就行了,
添加角色管理
Giant_Swordsman 2011-08-06
  • 打赏
  • 举报
回复
有人共享一个简单的例子就好了
沐NeMo 2011-08-06
  • 打赏
  • 举报
回复
学习学习。
cosmo_sei 2011-08-06
  • 打赏
  • 举报
回复
分为三个级别:
1 模块级别:用户没权限时无法访问整个模块,比如菜单上直接看不到入口。
2 界面元素级别:又可分为两块
2.1 不同用户看到的界面布局不同,比如看得到/看不到某个按钮
2.2 查询结果不同,比如同一个查询操作A用户可以看到全部内容,但B用户只能看到一个子集。
3 操作级别:比如用户提交一个操作,之后判断是否有权限,没有权限的话否决该操作。

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

对于上面级别3,是在BLL判断的,和LZ说的一样。
这里说下2.2的问题,这个目前没想出什么高效的方式,处理上分两种:
1 具体逻辑具体判断:比如A用户能访问所有商户记录,B只能访问注册资金10W以下的商户的记录,对于这种查询,权限配置上只建立了一个对应的“查询”对象,而具体实现由一个查询逻辑工厂提供,是代码实现的,对于每个查询需要单独实现。
2 数据库记录配置:在数据库对应查询表有一个权限字段,记录了该记录能够被查询的对应权限(的ID),程序查询时添加一个条件,将权限信息送过去匹配这个字段,不匹配的就查不到了。但这个方法要求数据库每一行都有权限这个字段,而且这个字段的变更限制很多,不容易调整。
johndii 2010-08-19
  • 打赏
  • 举报
回复
"我们要为每一个用户配置UI按钮权限,并且新增界面,又要把界面上的按钮在数据库中对应创建一条记录,并为每个人配置权限"

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

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

xiaomianao 2010-08-19
  • 打赏
  • 举报
回复
回johndii:控制UI的按钮方式的确更直观,用户有哪些功能在界面上直接体现,但是我们要为每一个用户配置UI按钮权限,并且新增界面,又要把界面上的按钮在数据库中对应创建一条记录,并为每个人配置权限,多麻烦。如果使用第二种方式,可以通过AOP的方式,使用代理类,结构也清晰。但是第二种方式也存在一个问题,例如某人在页面点击添加,是可以弹出创建窗体的,填写完好多内容,但是点击保存,弹出“你没有添加××的权限!”,用户肯定崩溃了,“我好不容易填写了那么多内容,你才告诉我不让太添加,这程序太蠢了吧”。也许 danjiewu 说的很对,两者并不冲突
Purple_Sky2010 2010-08-19
  • 打赏
  • 举报
回复
可以设置权限树,页面就是父节点,这个页面中的按钮就是子节点,根绝分配的权限去判断当前用户是否具有操作某些按钮的权限。 【用户表】 和【权限表】 其中用户表中保存用户的ID 和权限(权限是以权限编码1,权限编码2.....)形式保存的。
johndii 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 huangwanhai 的回复:]
第二种方法更灵活
一般我是做的第二种方法
[/Quote]

更?灵活在哪了。 是该关心需求还关心系统结构,看来大多数还是更关心实现。其实域、用户组、角色、系统配置已经有成熟的共识了。现在可讨论的就是项目需求,拿别的项目来套总有不合适。
-小蕾- 2010-08-19
  • 打赏
  • 举报
回复
我一般也是用第二种方法,只不过我有一个疑问,就是权限表本就控制了一些功能权限,就像某些菜单能操作,某些菜单不能操作,那么如何动态的限制增删改的权限呢。。也就是所谓的“细粒化”?
以前我的做法是没次点击一些按钮的时候再根据业务需要去判断,看是否有删除或者修改的权限,但是这样我觉得很繁琐。。
huangwanhai 2010-08-19
  • 打赏
  • 举报
回复
第二种方法更灵活
一般我是做的第二种方法
flien1 2010-08-19
  • 打赏
  • 举报
回复
用第二种方式,但是可以直接把当前用户所有权限取出,放入datatable
使用时候先判断datatable
danjiewu 2010-08-19
  • 打赏
  • 举报
回复
最好是1、2两种都要,并不冲突
johndii 2010-08-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 xiaomianao 的回复:]
回3楼,控制窗体其实是菜单权限,如果更细些,例如某角色只有查看+添加功能,某角色有 查看+添加+修改+删除功能,这个就要控制到具体的一个操作了
[/Quote]

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

产品就是要关系用户体验,对用户透明,每次都告诉他没权限岂不郁闷。
程序员的价值就是为了提高效率节省资源。有很多单位用软件一开就是一天到一月不等,每次操作都要判断就显得麻烦了。
xiaomianao 2010-08-19
  • 打赏
  • 举报
回复
感谢各位的回复

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

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

uvvvw:这个是客户要求的
guyehanxinlei 2010-08-19
  • 打赏
  • 举报
回复
需要看你的业务需要
加载更多回复(18)

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧