Posted on 2005-12-03 01:14
李天平 阅读(23485)
评论(25) 编辑 收藏
在开发很多项目的时候,都会用到用户权限管理,我也在很多项目里做过权限控制,所以,我也总结出一套条理清晰的角色权限控制体系.并且完善,减少模块的耦合度,做成一个独立的模块,用在很多项目里.
先来看看管理界面的效果图:
1.系统管理菜单

2.权限管理。设置权限类别和权限信息。

3. 角色管理
4. 为角色分配权限。

5.为用户分配角色

有时间我会再想想多层权限控制的问题,来实现权限的递归控制.
http://www.maticsoft.com/Appstore.aspx
Feedback
我在做项目过程中,发现权限管理说起来容易,实现的东西看起来很好,但到项目进展到一定时间后,就有点感觉力不从心了。
有的用url控制,感觉这个只能控制5、60%左右,尤其是对做MIS系统而言。
经常是页面大家都有权限进去,但看到的数据根据权限不同而不同,有很多时候要根据权限来控制Where语句的写法。
这方面我一直没有把思路理的很顺,不知兄台的权限管理可以控制到哪一个层面,是否可以指导指导小弟。
万谢!我的mail是zhyuque@hotmail.com
我也遇到了和楼上相同的问题,天平兄有什么好的主意吗?ypj658@163.com
@涤生,蓝鸟,我的大体思路是基于:权限-角色-用户的结构来设计权限系统,并封装为单独的模块,跟业务系统的耦合也不是很高。权限可以和业务系统再建立一个关联。这样就形成了业务-权限-角色-用户,这样的业务链关系,用户拥有什么样的权限就可以看到什么样的业务数据和进行什么样的业务操作;对一个业务操作用户有没有权限操作,也可以通过关联判断用户是否具有该权限来执行。只要你把这些关联和操作封装接口做的好一些,在表示层操作的的时候,就会很省力很灵活。
你们也可以看一下这里的一套示例系统源码里的权限模块。也许对你们有所启发
http://ltp.cnblogs.com/archive/2006/01/09/306887.html
To:天平兄
在您的未例系统中,我好像找不到有关根据权限来控制Where语句的用法。
按您上面写的思路,我觉得还有不对,如果我要按权限来决定一个页面内不同内容的显示Visable呢。
Allen Zhang
比如权限表如下
PermissionID Description
1 帐户管理
2 用户管理
3 菜单管理
在*.cs中如下
if(!user.HasPermission("帐户管理")) 或者
if (!user.HasPermission(1))
假如在数据库中删除“帐户管理”这条记录,在*.cs文件中不论是
*.cs文件是不是要重新编译才行?因为用户返回的PermissionIDs肯定不会有这条记录了。
@阿良,这里只是一个例子,你完全可以做一个权限和业务模块的对应表啊,这样当访问或操作一个模块时,可以动态的获取模块对应的权限ID,然后通过if (!user.HasPermissionID(权限ID)) 就可以判断用户是否有该权操作该模块了。权限和模块都是动态维护和处理的,这样就很灵活了。
在用帐号:admin,密码:1
登录时出现错误,请问怎么解决?
用户 'sa' 登录失败。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.Data.SqlClient.SqlException: 用户 'sa' 登录失败。
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:
[SqlException: 用户 'sa' 登录失败。]
System.Data.SqlClient.ConnectionPool.GetConnection(Boolean& isInTransaction) +474
System.Data.SqlClient.SqlConnectionPoolManager.GetPooledConnection(SqlConnectionString options, Boolean& isInTransaction) +372
System.Data.SqlClient.SqlConnection.Open() +384
LiTianPing.DBUtility.DbHelperSQL.ExecuteSql(String SQLString) +93
未将对象引用设置到对象的实例。
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.NullReferenceException: 未将对象引用设置到对象的实例。
源错误:
执行当前 Web 请求期间生成了未处理的异常。可以使用下面的异常堆栈跟踪信息确定有关异常原因和发生位置的信息。
堆栈跟踪:
[NullReferenceException: 未将对象引用设置到对象的实例。]
LiTianPing.Web.Accounts.userupdate.Page_Load(Object sender, EventArgs e) +410
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +35
System.Web.UI.Page.ProcessRequestMain() +731
@admin777777,你是指CodematicDemo吗?不清楚你用的哪个版本的?
sa登录失败看你的数据库连接字符串是否正确?用户和密码是否正确?不知你用的哪个版本?设个断点跟踪一下看是在什么地方出的错?
是CodematicDemo版的,数据库问题已经解决(忘记把压缩包中的DATABASE文件附加数据库了。。呵呵)
但是现在出现一个新的问题,我早上偶然发现的,弄了一上午,网上到处找解决办法还是不行。问题就是点击“用户管理”模块中的编辑按钮会出错,错误就是上面发那个.因为毕业设计我的题目刚好用到这个模型,希望李老师教下我解决的方法,谢谢了,急死了。。。
[NullReferenceException: 未将对象引用设置到对象的实例。]
LiTianPing.Web.Accounts.userupdate.Page_Load(Object sender, EventArgs e) +410
System.Web.UI.Control.OnLoad(EventArgs e) +67
System.Web.UI.Control.LoadRecursive() +35
System.Web.UI.Page.ProcessRequestMain() +731
权限和模块都是动态维护和处理的,这样就很灵活了。
不是很明白模块怎么动态维护呢?用户如何维护模块?是不是应该系统定义。
关于天平大虾提出的:业务-权限-角色-用户,业务链关系对我启发较大。谢谢!:)
不过,我觉得权限的设置是有限的,必须有相应的业务已经设定好了,才能添加相应的权限,不然添加的权限是没有任何意义的。不知天平大虾如何看?
权限着块儿没研究过,看到各位的思路基本是系统角色和功能都出来了,然后给角色分配权限使其对相应模块操作或显示。有个不同的想法,为什么不oo一点每个角色类里就包含了对有权限的sourse的操作,没权限的就不包含,这样在new这个角色对象时就已经包含权限在里面了。呵呵,只是本人一点想法,不知各位怎么想?
天平兄:
今天刚测试完你的2.0,
我先是新建了一个权限组
然后在新建一个用户,只给这个用户一个查询商品的权限
最后查看商品后,点删除,我晕,真还能删除,但是我给的权限就没有删除,
不知道天平兄有何解释?怎么样才能解决这个问题!
代码中根本没有权限检测的地方!!
LiTianPing.BLL.Demo.Product bll = new LiTianPing.BLL.Demo.Product();
string ProductId = Request.Params["id"];
bll.Delete(ProductId);
Response.Redirect("index.aspx");
看看!这是你的DELECT.ASP.CS中的语句!!没有权限检测!!!
扩展呢?
如果你提供了别人编译好后的代码,别人如何扩展权限? 最近正在研究这个! 嘿嘿!
LTP.Accounts.dll源码已在《亮剑.NET:.NET深入体验与实战精要》中进行了一些介绍,并且附赠完整源码。有需要者可以查阅该书参考。
@涤生
我觉得用分层设计,还是比较好弄清楚
把权限分配方案,要画出来,然后再编码