Como sé CanCan y declarative_authorization, e implementé autorizaciones basadas en roles tanto, recomiendo CanCan. Solo mis dos centavos.
Ejemplo (no probado, por desgracia no puedo probar aquí y no tengo acceso a mi código)
Así que vamos a decir que tenemos una estructura como esta:
class User < ActiveRecord::Base
belongs_to :role
end
class Role < ActiveRecord::Base
has_many :users
# attributes: project_read, project_create, project_update
end
Entonces, CanCan podía mirar de esta manera:
class Ability
include CanCan::Ability
def initialize(user)
@user = user
@role = user.role
# user can see a project if he has project_read => true in his role
can :read, Project if role.project_read?
# same, but with create
can :create, Project if role.project_create?
# can do everything with projects if he is an admin
can :manage, Project if user.admin?
end
end
Puede encontrar toda la información que necesita en la wiki de CanCan en github. Recomendación personal para leer:
Básicamente sólo tiene que extender el ejemplo anterior para incluir sus funciones a través de sus relaciones. Para hacerlo simple, también puede crear métodos de ayuda adicionales en ability.rb
.
La principal deficiencia media se podría caer por (al menos yo): Asegúrese de que el usuario puede hacer algo con un modelo antes de definir lo que el usuario no puede . De lo contrario, te sentirás frustrado y pensarás "¿pero por qué? Nunca escribí que el usuario no pueda". Sí. Pero también nunca escribió explícitamente que él puede ...
En CanCan puedes definir habilidades a través de bloques con condiciones - https://github.com/ryanb/cancan/wiki/Defining-Abilities-with-Blocks. –
1. TeamMembers tiene muchos usuarios, Roles 2. Los equipos tienen muchos TeamMembers 3. El proyecto tiene un equipo ... Con Blocks, la configuración anterior no proporciona un medio para filtrar una instancia específica de proyecto. Si crees que se puede hacer ... ¿Podrías darme un ejemplo? Gracias por adelantado. –