Últimamente he tenido que lidiar con el tema de intentar controlar permisos de acceso a determinados webform en uno de mis proyectos y lo he resuelto creo que bastante bien mediante el uso de atributos personalizados aplicados a esos webform.
Estos atributos se definen como una clase que nos permite aplicar un valor por ejemplo y posteriormente poder acceder a el mediante la lectura de atributos personalizados del objeto que queramos.
esta clase de atributo se define de la siguiente forma (NombreObjeto es en si el nombre del atributo, no texto para sustituir)
[sourcecode language=»csharp»]
<System.AttributeUsage(System.AttributeTargets.Class,
AllowMultiple:=False,
Inherited:=True)>
Public Class NombreObjeto
Inherits System.Attribute
Private m_cDescripcionObjeto As String
Private m_cNombreObjeto As String
Public Sub New(ByVal _NombreObjeto As String)
m_cNombreObjeto = _NombreObjeto
‘m_cDescripcionObjeto = _Descripcion
End Sub
Public ReadOnly Property Nombre As String
Get
Return m_cNombreObjeto
End Get
End Property
End Class
[/sourcecode]
Así en cada Form podemos usar el atributo de la siguiente forma, como vereis ademas tengo otro atributo que me permite definir la operacion por defecto que admite el formulario, en este caso «R» (READ)
[sourcecode language=»csharp»]
Imports DevExpress.Web.ASPxEditors
Imports System.Reflection
<NombreObjeto("WF_ADMIN_CONTACTO")>
<OperacionesPorDefecto("R")>
Public Class Contacto
Inherits PageBaseClass
[/sourcecode]
Ya tenemos la posibilidad de aplicar a cada formulario un nombre o codigo que lo identifique en la base de datos, cierto que podemos podriamos usar su nombre de archivo pero nos implicaría que tendriamos problemas si decidimos cambiarlo por cualquier motivo.
y por último, necesitamos acceder a estos atributos cuando hacemos la carga del formulario, para consultar sobre la base de datos si por ejemplo un usuario tiene permiso para ver ese formulario.
De la siguiente forma accedemos al valor del atributo.
En mi caso lo hago en la clase base de la que hereda el formulario.
[sourcecode language=»csharp»]
….
Dim oNombreObjeto As NombreObjeto
Dim oOperacionPorDefecto As OperacionesPorDefecto
‘Dim attSoloSA As soloSA
Dim info As System.Reflection.MemberInfo = Me.GetType()
If (IsNothing(CType(Attribute.GetCustomAttribute(info, GetType(soloSA)), soloSA))) Then
‘Dim infoattrs As List(Of Reflection.CustomAttributeData) = info.GetCustomAttributes(NombreObjeto, True)
oNombreObjeto = CType(Attribute.GetCustomAttribute(info, GetType(NombreObjeto)), NombreObjeto)
oOperacionPorDefecto = CType(Attribute.GetCustomAttribute(info, GetType(OperacionesPorDefecto)), OperacionesPorDefecto)
….
despues hago algo como esto
if(TieneAcceso(oNombreObjeto.Nombre, m_cOperacionSolicitada) then
….
[/sourcecode]