posts - 69, comments - 297, trackbacks - 21, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

利用 BasePage 实作窗体权限控管

Posted on 2008-06-10 22:56 jeff377 阅读(2646) 评论(19)  编辑 收藏 所属分类: ASP.NET 基础

摘要
若窗体(页面)具有「执行、新增、修改、删除」等操作权限控管,可以使用列举来描述使用者在该窗体的权限,详细的作法可以参考下面的「Enum 的设计与应用 - 简易权限设计」这篇文章。在此我们将利用这种列举的方式来描述窗体权限,并由 BasePage 来处理窗体权限的控管。

程序说明及实作
首先定义 EFormActions 列举,来描述窗体操作权限。

    ''' <summary>
    
''' 窗体操作权限列举。
    
''' </summary>

    <Flags()> _
    
Public Enum EFormActions
        
''' <summary>
        
''' 无。
        
''' </summary>

        None = 0
        
''' <summary>
        
''' 执行。
        
''' </summary>

        Execute = 1
        
''' <summary>
        
''' 新增。
        
''' </summary>

        Add = 2
        
''' <summary>
        
''' 修改。
        
''' </summary>

        Update = 4
        
''' <summary>
        
''' 删除。
        
''' </summary>

        Delete = 8
        
''' <summary>
        
''' 全部。
        
''' </summary>

        All = Execute Or Add Or Update Or Delete
    
End Enum


新增一个 TBActionPage 类别,继承至 System.Web.UI.Page 或自订的底层 BaseForm,做为权限控管的 BaseForm。首先新增一个 UserActions 属性,来描述使用者的窗体操作权限,在 OnInitComplete 方法中,第一次加载此窗体时取得使用者的窗体权限,即设定 UserActions 属性,此属性会储存至 ViewState 中,使下次页面 PostBack 时无需再重新取得窗体权限。另外新增 CheckUserActions 方法,供检查使用者是否具有指定的窗体操作权限。

Public Class TBActionPage
    
Inherits System.Web.UI.Page
    
''' <summary>
    
''' 使用者权限。
    
''' </summary>

    Private FUserActions As EFormActions = EFormActions.None

ViewState 状态管理

    
''' <summary>
    
''' 覆写。引发 InitComplete 事件。
    
''' </summary>

    Protected Overrides Sub OnInitComplete(ByVal e As System.EventArgs)
        
If Not Me.IsPostBack Then
            
'取得使用者的窗体权限
            '测试用:设定使用者具「执行/新增/修改」权限,实际应呼叫中间层取得使用者的此窗体权限
            Me.UserActions = EFormActions.Execute Or EFormActions.Add Or EFormActions.Update

            
'第一次加载页面时检查执行权限
            If Me.UserActions = EFormActions.None Then
                
Throw New Exception("没有此窗体执行权限")
            
End If
        
End If

        
MyBase.OnInitComplete(e)
    
End Sub


    
''' <summary>
    
''' 使用者的窗体操作权限。
    
''' </summary>

    Public Property UserActions() As EFormActions
        
Get
            
Return FUserActions
        
End Get
        
Set(ByVal value As EFormActions)
            FUserActions 
= value
        
End Set
    
End Property


    
''' <summary>
    
''' 检查使用者是否具有指定的窗体操作权限。
    
''' </summary>
    
''' <param name="Actions">窗体操作权限</param>

    Public Function CheckUserActions(ByVal Actions As EFormActions) As Boolean
        
If (Me.UserActions And Actions) = Actions Then
            
Return True
        
Else
            
Return False
        
End If
    
End Function


End Class


测试程序
为测试使用,在上述的 TBActionPage 的 OnInitComplete 方法,直接设定具有「执行/新增/修改」权限;正确的作法应该是呼叫中间层传入该窗体的识别码来取得使用者在该窗体具有那些权限,并在此设定 UserActions 属性值。

Me.UserActions = EFormActions.Execute Or EFormActions.Add Or EFormActions.Update

新增一个测试页面,继承至 TBActionPage,当按下按钮时利用 CheckUserActions 使用者具那些权限并输出。

Imports Bee.Web.WebCommon

Partial Class _Default
    
Inherits Bee.Web.TBActionPage

    
Protected Sub Button1_Click(ByVal sender As ObjectByVal e As System.EventArgs) Handles Button1.Click
        
Me.Response.Write("執行 -> " & IIf(Me.CheckUserActions(EFormActions.Execute), "Y""N"))
        
Me.Response.Write("< br/ >")
        
Me.Response.Write("新增 -> " & IIf(Me.CheckUserActions(EFormActions.Add), "Y""N"))
        
Me.Response.Write("< br/ >")
        
Me.Response.Write("修改 -> " & IIf(Me.CheckUserActions(EFormActions.Update), "Y""N"))
        
Me.Response.Write("< br/ >")
        
Me.Response.Write("刪除 -> " & IIf(Me.CheckUserActions(EFormActions.Delete), "Y""N"))
    
End Sub

End Class


执行结果如下




 

Tag标签: BasePage

Feedback

#1楼    回复  引用  查看    

2008-06-11 00:21 by 簡簡單單..      
Mark

#2楼    回复  引用  查看    

2008-06-11 09:11 by 萧寒      
不错的方法!

#3楼    回复  引用  查看    

2008-06-11 09:16 by good man      
这一种方法也可以,楼主可以做一个UserControl,这样更方便哟

#4楼    回复  引用  查看    

2008-06-11 09:20 by 小寒      
首先,在同一个窗体,基本上只会执行1,2个权限操作不会同时出现太多钟的操作
第二,即使出现多种操作,那么基本上这些操作对于可以访问这个窗体的用户来说,基本上也都是可以进行的
第三,如果页面上出现多条记录,比如说删除操作,但用户只有某些数据的删除权限,某些数据不允许他操作,你怎么处理

个人认为权限不可能完全取分割功能权限和数据权限,两者的结合才可以比较完整的实现权限问题

#5楼 [楼主]   回复  引用  查看    

2008-06-11 09:22 by jeff377      
@good man
我会使用 BasePage 是有原因的,因为其它的自订服务器控件还可以跟 BasePage 做互动,例如自订工具列(Toolbar)控件,其中有「新增、修改、删除...」等按钮,而 Toolbar 本身就可以判断 BasePage 的使用者权限,自动将相关按钮设为启用/失效。这样开发人员可以不会管到任何权限控管的部分,只需负责撰写商业逻辑的部分。

#6楼 [楼主]   回复  引用  查看    

2008-06-11 09:33 by jeff377      
@小寒
基本上功能权限的控管的对象是窗体(页面),所以若是多笔的状况(如 GridView),若有编辑权限,则所有多笔记录皆可编辑。
而操作权限可能会非常多种,以 ERP 系统为例,可能就包含「执行/浏览、新增、删除、修改、打印、汇出、核决...等」操作权限,这样操作权限的控管还要配合其它 UI 的自订控件才比较完整。

#7楼    回复  引用  查看    

2008-06-11 09:35 by willieQ      
不错的办法,学习~~~

#8楼    回复  引用    

2008-06-11 10:08 by allies [未注册用户]
- -飘过

#9楼    回复  引用    

2008-06-11 10:44 by lzppcc [未注册用户]
楼主这个方法不太方便,可以看一看http://framework.supesoft.com/,可以在方法上增加属性来判断权限.使用起来比这方便.

#10楼    回复  引用    

2008-06-11 12:15 by ff [未注册用户]
主要就是一个继承实现就有这么多内容。强大啊

#11楼    回复  引用  查看    

2008-06-11 16:13 by willieQ      
不错,学习中。。。。。。。。。

#12楼    回复  引用  查看    

2008-06-11 19:58 by 麦舒      
这种方法实现权限限制太多了。个人认为,要实现权限管理,最好用Asp.net提供的Membership以及Role。

#13楼 [楼主]   回复  引用  查看    

2008-06-11 20:01 by jeff377      
@麦舒
问题就是Asp.net提供的Membership以及Role无法做到细部的操作权限控管,即同一个页面具有「浏览、新增、删除、修改...等」操作权限。

#14楼    回复  引用  查看    

2008-06-11 22:40 by 麦舒      
--引用--------------------------------------------------
jeff377: @麦舒
问题就是Asp.net提供的Membership以及Role无法做到细部的操作权限控管,即同一个页面具有「浏览、新增、删除、修改...等」操作权限。
--------------------------------------------------------
绝对可以的。同一个页面可以映射成不同的路径或者文件名。例如
/Add/PageName.aspx
/Update/PageName.aspx
/Delete/PageName.aspx
或者
Page_Add.aspx
Page_Delete.aspx
Page_Update.aspx
在PageName.aspx文件中,通过判断文件夹,或者文件名来执行不同的操作。

还有,权限不能保存在ViewState中,容易安全出现问题。

#15楼 [楼主]   回复  引用  查看    

2008-06-11 22:59 by jeff377      
@麦舒
新增、删除、修改可以在一个页面中处理,为了配合 Membership以及Role,而将其分成三个页面,这样不是更难维护了吗?
若认为 ViewState 不安全,可以将其储存在 Catch或其它地方中就可以解决此问题,而且这段程序代码在 BasePage 中,可以随意依情形修正储存目的。

#16楼    回复  引用    

2008-06-12 12:29 by jfan [未注册用户]
与我的方法一样.呵呵.

#17楼    回复  引用  查看    

2008-06-28 17:17 by 鹏鹏_Lovely      
有没有C#的版本啊。

#18楼    回复  引用    

2008-08-28 18:08 by mzc [未注册用户]
楼主,请问你的这个中间层获取权限值是用什么方法会比较好呢?

#19楼 [楼主]   回复  引用  查看    

2008-08-28 19:02 by jeff377      
@mzc
首先有个数据表去存放「用户/功能的权限设定」数据,包含「用户编号、功能代码、权限值」三个字段,
可以透过特定组件去数据库抓取这个目前登入用户在该页面(功能)的权限值。

标题  
姓名  
主页
Email (只有博主才能看到) 
验证码 *  看不清,换一张 [登录][注册]
内容(请不要发表任何与政治相关的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
该文被作者在 2008-06-10 23:43 编辑过


相关链接: