如何在基类中取消订阅派生类Load事件 避免未授权访问时数据泄露
解决方案
核心思路是利用OnLoad方法是Load事件的触发源这一特性,在基类中重写该方法,权限校验不通过时不调用基类的OnLoad实现,从根源上阻止所有Load事件订阅逻辑的执行,完全不需要修改任何派生类代码。
具体实现步骤
- 移除基类中原本的
Form_Load事件处理方法 - 在
AuthBaseForm中重写OnLoad方法 - 可选新增更早的拦截逻辑,减少不必要的资源初始化
修改后的基类代码
Public Class AuthBaseForm Inherits DevExpress.XtraEditors.XtraForm Property IsAuthorized As Boolean = False Private Sub InitializeComponent() Me.SuspendLayout() ' 'StartUpForm ' Me.ClientSize = New System.Drawing.Size(825, 432) Me.Name = "AuthBaseForm" Me.AutoScaleMode = Windows.Forms.AutoScaleMode.Dpi Me.ResumeLayout(False) End Sub Public Sub New() MyBase.New() ' 权限校验提前到构造阶段 IsAuthorized = GetUserRoleInForm(Me) ' 可选:无权限时提前禁用表单属性,减少初始化开销 If Not IsAuthorized Then Me.FormBorderStyle = FormBorderStyle.None Me.ShowInTaskbar = False Me.StartPosition = FormStartPosition.Manual Me.Location = New Point(-10000, -10000) Me.Size = New Size(1, 1) End If End Sub ' 重写OnLoad方法,作为权限拦截入口 Protected Overrides Sub OnLoad(e As EventArgs) If Not IsAuthorized Then MsgBox("You do not have permissions to show this form!", vbExclamation + vbOKOnly) Me.Close() Return End If ' 仅权限校验通过时,才触发Load事件,执行基类和派生类的Load逻辑 MyBase.OnLoad(e) End Sub ' 可选:无权限时拦截所有窗口消息,彻底阻止派生类任何逻辑执行 Protected Overrides Sub WndProc(ByRef m As Message) If Not IsAuthorized Then ' 仅放行关闭消息 If m.Msg = &H10 Then ' WM_CLOSE MyBase.WndProc(m) End If Return End If MyBase.WndProc(m) End Sub End Class
方案优势
- 零侵入:不需要修改400+个派生表单的任何代码,改造成本极低
- 安全性高:权限校验在
Load事件触发前完成,不会执行派生类中任何数据加载、敏感资源访问的逻辑,完全避免数据泄露风险 - 兼容性强:完全兼容现有代码逻辑,不会影响有权限用户的正常使用
内容的提问来源于stack exchange,提问作者urnotmytype
相关产品推荐
相关产品推荐

