1、安全身份验证基类重要性
为何要在讲解数据库操作核心类库前,需要讲解此基类。主要是基于以下几个因素:
- 相对安全性
既然是核心数据库操作类库,很大程度上,并不希望无关人员调用此类库,尤其是在企业内部或者第三方开发的应用程序被其他用户调用。
- 授权等级
同一团队合作中,为了管控每个用户的使用数据库操作等级。例如某个开发用户A,可从此类库调用的函数,只能是读取数据库,删除和更新则没有;某个开发用户B,可以调用此类库的读取、更新等操作数据库的函数,但函数提供的参数不一样,不可使用事务操作。
- 后续授权扩展可用性
此基类,可以让其他类库继承,并不一定只限制与操作数据库的内容;有些类库只属于核心团队调用;有些类库是普通团队也可以,各自开发组群根据各自需要自行设置安全等级参数。
2、授权等级设置
设置一个授权等级的枚举类型:
''' <summary>
''' 说明:授权等级
''' </summary>
''' <remarks></remarks>
Public Enum EmpowerLevel
A = 1
B = 2
C = 3
D = 4
E = 5
F = 6
Z = 50
End Enum
授权等级从A-Z,意味着从高到低,授权等级越高,今后涉及到开发类库中,可调用的函数会越多。
如果你想A1,A2,A3怎么设置也一样,这个只是为了今后调用方案,统一这么设置。内部开发团队了解就ok,只是一个操作规范而已。
3、身份验证类库设计思路
属性信息设置
- 用户名
我们需要提高给开发用户一个账户,也是其唯一用户ID
- 授权信息
此用户授权信息是加密的信息,判断用户是否被授权调用此类库
- 校验码
此校验码,是在授权验证通过,提取用户的授权等级
- 授权验证通过
授权验证完毕后,返回一个属性,记录通过还是不通过,如果不通过,则直接强制退出
- 授权等级
最后验证完毕后,返回授权等级
- 返回信息
如果验证失败,则返回提示信息
方法设置
- 授权校验函数
对于授权码的验证,确定是否授权,授权通过,则返回授权验证通过
- 获取授权等级函数
在授权验证通过后,根据校验码,返回授权等级。
设计参数类型
为了类型使用并不确定,也为方便操作,此基类的相关参数采用泛型。
主要是定义http://VB.NET泛型类型时,即使用一个或多个数据类型将其参数化。这样可允许使用代码定制数据类型以满足其要求。代码可以通过泛型元素声明若干个不同的编程元素,每个元素可使用一组不同的数据类型。但是,无论声明的元素使用哪些数据类型,它们均执行相同的逻辑。
具体介绍,可以参考VB.net学习笔记(十九)数组、集合、泛型 ,里面讲的不错。当然也可以在百度里搜索下VB.NET 泛型
基本的思路已经构造完毕,剩下编写代码
''' <summary>
''' 创建时间:2019.8.10
''' 作者: kevin zhu
''' 说明:安全身份验证基类,继承此基类的子类要重写
''' </summary>
''' <typeparam name="T">泛型参数,可以是用户ID</typeparam>
''' <typeparam name="V">泛型参数,默认是类授权码</typeparam>
''' <typeparam name="P">泛型参数,默认是过程及函数授权码</typeparam>
''' <remarks></remarks>
Public MustInherit Class SecuriVerify(Of T, V, P)
#Region "基类相关参数"
''' <summary>
''' 说明:授权用户名
''' </summary>
''' <remarks>只能程序集里访问</remarks>
Friend MUserName As T '//用户名
''' <summary>
''' 说明: 类使用的授权码
''' </summary>
''' <remarks>只能程序集里访问</remarks>
Friend MSecuriKey As V '//类授权码
''' <summary>
''' 说明:类里面的函数及过程调用的授权码
''' </summary>
''' <remarks>只能程序集里访问</remarks>
Friend MProcKey As P '//类中函数及过程授权码
''' <summary>
''' 说明:身份验证通过与否标记
''' </summary>
''' <remarks>程序集或派生类可以访问</remarks>
Protected MSecuriPass As Integer
''' <summary>
''' 说明:'//过程及函数授权等级
''' </summary>
''' <remarks>只能在程序集或者派生类中访问</remarks>
Protected MProcLevel As EmpowerLevel
''' <summary>
''' 说明:错误信息记录
''' </summary>
''' <remarks></remarks>
Public MErrMessage As String
#End Region
#Region "基类相关属性"
''' <summary>
''' 说明:返回过程及函数使用的等级
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks></remarks>
Protected MustOverride ReadOnly Property ProcLevel As EmpowerLevel
''' <summary>
''' 说明: 类调用前身份验证是否通过。1=通过,0=不通过
''' </summary>
''' <value></value>
''' <returns></returns>
''' <remarks>未通过,则无法使用调用类</remarks>
Protected MustOverride ReadOnly Property SecuriPass As Integer '//验证码是否通过。1=通过,0=不通过
Public MustOverride ReadOnly Property ErrMessage As String '//错误信息反馈
#End Region
''' <summary>
''' 说明:有些类确实需要不带参数的构造函数
''' </summary>
''' <remarks>程序集内部可以访问</remarks>
Friend Sub New()
MSecuriPass = 0
MProcLevel = EmpowerLevel.Z
MErrMessage = ""
End Sub
''' <summary>
''' 说明: 声明的构造函数保证了外部程序集不可继承该类
''' </summary>
''' <remarks></remarks>
Friend Sub New(ByVal vUserName As T, ByVal vSecuriKey As V, ByVal vProcKey As P)
MSecuriPass = 0
MProcLevel = EmpowerLevel.Z
MErrMessage = ""
Try
MUserName = vUserName
MSecuriKey = vSecuriKey
MProcKey = vProcKey
MSecuriPass = CheckCode(MUserName, MSecuriKey)
If MSecuriPass = 0 Then
ExportMessage("Error-1<未被授权无法调用>")
Exit Sub
End If
'//进行过程及函数授权等级获取
MProcLevel = ProcPermission(vProcKey)
Catch ex As Exception
ExportMessage(ex.Message)
Exit Sub
End Try
End Sub
#Region "基类相关函数及过程"
''' <summary>
''' 说明:身份验证函数,输入用户及验证码确认无误后。返回值1,否则返回值0
''' </summary>
''' <param name="vUserName">用户名</param>
''' <param name="vCode">验证码</param>
''' <returns>验证通过1,不通过=0</returns>
''' <remarks>当前函数子类内部可以访问</remarks>
Friend MustOverride Function CheckCode(vUserName As T, vCode As V) As Integer
''' <summary>
''' 说明:过程及函数调用前的验证。根据验证码返回使用等级,不同函数及过程划分几个使用等级
''' </summary>
''' <param name="vCode">函数及过程授权码</param>
''' <returns></returns>
''' <remarks>当前函数子类内部可以访问</remarks>
Friend MustOverride Function ProcPermission(vCode As P) As EmpowerLevel
#End Region
End Class
代码解释:
其中CheckCode和ProcPermission函数声明成friend,其实是考虑是基类,继承子类要重写,friend函数只能同类库中调用,隐藏类库,防止外部用户调用。
此基类+后续编译加密,可以防止非授权用户调用。
类库代码发布在github, 有兴趣的朋友可以下载,帮忙点个赞。
后续还要分篇讲解类库数据库操作的部分,敬请期待,保持关注。