Estoy trabajando en una aplicación web de Rails, y actualmente la utilizan unos 20 usuarios.¿La mejor manera de implementar la autorización detallada para una aplicación web?
Algunas partes de la aplicación solo son accesibles para algunos usuarios, por lo que ya contamos con un marco de autorización básico, que implementé utilizando el complemento acts_as_authenticated.
Los privilegios de los usuarios dependen del departamento en el que trabajan, por ejemplo, la administración tiene acceso a todas las partes de la aplicación, mientras que la contabilidad solo tiene acceso a las partes relacionadas con la contabilidad y las ventas solo tienen acceso a ventas partes, etc.
Por otro lado, los usuarios ven los enlaces a acciones para las cuales tienen privilegios insuficientes. Por ejemplo, aquellos en el departamento de ventas ven un enlace a los registros financieros en el menú principal, pero cuando hacen clic en él, no pasa nada. Esto es así porque AFAIK no hay una manera eficiente de consultar privilegios de usuario usando acts_as_authenticated.
Quiero cambiar esto de dos maneras:
me gusta mostrar a la autorización de grano fino. Actualmente, la autorización se realiza a nivel de controlador. Quiero hacer esto a nivel de acción o modelo. Por ejemplo, quiero que aquellos en el departamento de ventas puedan crear y actualizar pagos, pero no eliminarlos.
Quiero poder consultar los privilegios de usuario de manera eficiente, así puedo eliminar enlaces innecesarios (y confusos) de la interfaz.
¿Cuál cree que es la forma más elegante de implementar esto?
Las respuestas específicas de los raíles no son necesarias, solo quiero saber cómo esto debe implementarse en una aplicación basada en datos.
Por último, aquí es cómo se implementa actualmente:
def authorized?
current_user.role.foo? or current_user.role.bar?
end
Y aquí está mi idea inicial, que creo que no es la mejor manera de resolver esto:
+------------+------------+---------+ | department | controller | action | +------------+------------+---------+ | accounting | payments | index | | accounting | payments | new | | accounting | payments | create | | accounting | payments | edit | | accounting | payments | update | | accounting | payments | destroy | | sales | payments | new | | sales | payments | create | | sales | payments | edit | | sales | payments | update | +------------+------------+---------+
o
+------------+----------+-------+--------+------+--------+--------+ | department | model | list | create | read | update | delete | +------------+----------+-------+--------+------+--------+--------+ | accounting | payments | TRUE | TRUE | TRUE | TRUE | TRUE | | sales | payments | FALSE | TRUE | TRUE | TRUE | FALSE | +------------+----------+-------+--------+------+--------+--------+
Ya tengo una tabla de departamentos y una tabla users_departments. Simplifiqué la tabla de ejemplos para abreviar. –