A menudo encuentro la siguiente situación en la que necesito ofrecer muchos tipos diferentes de permisos. Yo uso principalmente ASP.NET/VB.NET con SQL Server 2000.¿Cuál es la mejor manera de manejar múltiples tipos de permisos?
Escenario
quiero ofrecer un sistema de permiso dinámico que puede trabajar en diferentes parámetros. Digamos que quiero dar acceso a una aplicación a un departamento o simplemente a una persona específica. Y pretendemos que tenemos una serie de aplicaciones que sigue creciendo.
En el pasado, he elegido una de las siguientes dos formas en que sé hacer esto.
1) Use una sola tabla de permisos con columnas especiales que se utilizan para determinar cómo aplicar los parámetros. Las columnas especiales en este ejemplo son TypeID y TypeAuxID. El SQL se vería así.
SELECT COUNT(PermissionID)
FROM application_permissions
WHERE
(TypeID = 1 AND TypeAuxID = @UserID) OR
(TypeID = 2 AND TypeAuxID = @DepartmentID)
AND ApplicationID = 1
2) Utilizar una tabla de asignación para cada tipo de permiso, a continuación, unirse a todos juntos.
SELECT COUNT(perm.PermissionID)
FROM application_permissions perm
LEFT JOIN application_UserPermissions emp
ON perm.ApplicationID = emp.ApplicationID
LEFT JOIN application_DepartmentPermissions dept
ON perm.ApplicationID = dept.ApplicationID
WHERE [email protected]
AND ([email protected] OR [email protected] OR
(emp.UserID IS NULL AND dept.DeptID IS NULL)) AND ApplicationID = 1
ORDER BY q.QID ASC
Mis pensamientos
espero que los ejemplos tienen sentido. Los improvisé juntos.
El primer ejemplo requiere menos trabajo, pero ninguno de ellos parece ser la mejor respuesta. ¿Hay una mejor manera de manejar esto?
El problema que encontré con este enfoque es que es muy fácil quedarse sin papeles utilizando este enfoque. Como puede ver, 6 roles tienen un valor de 2^6 = 64, cuando 31 roles tendrán 2^31 = 2,147,483,647, que es el valor máximo int. Entonces, en T-SQL, el tipo de datos más grande que se puede usar es 'bigint' (2^63). Por supuesto, puede usar el tipo varchar, pero prefiero usar la solución de John Downey cuando tengo muchos roles. –