ruby on rails - cancancan - Rails 4 roles y permisos de usuario
roles rails (3)
Estoy escribiendo una aplicación de rieles para una organización. Cada usuario puede tener 1 o más roles y solo puede acceder a ciertas acciones del controlador en función de esos roles.
Por ejemplo, solo los administradores pueden crear, destruir y actualizar ciertos campos de los User
. Además, hay Team
que tienen un líder de equipo , y solo el líder del equipo puede actualizar cierta información sobre el Team
(como la lista de miembros, por ejemplo). Sin embargo, los Admins
son los que asignan al líder del equipo en primer lugar.
Los detalles específicos de mi escenario no son importantes, simplemente espero haber descrito la situación en la que hay muchos roles y permisos diferentes.
Mi pregunta es: ¿qué gema usar? Mi primer pensamiento fue CanCan, pero el último compromiso fue hace casi un año y no se menciona la compatibilidad con Rails 4. ¿Hay alguna alternativa actualmente mantenida?
Algo que se me sugirió que ahora estamos usando es la gema petergate . Fácil de usar y de aspecto muy limpio con una gran sensación de rieles.
Funciona bien con el devise .
Aquí hay algunos ejemplos del archivo Léame.
Si está utilizando un dispositivo, está de suerte, de lo contrario tendrá que agregar los siguientes métodos a su proyecto:
user_signed_in?
current_user
after_sign_in_path_for(current_user)
authenticate_user!
Esto viene en su User.rb. Agregar más roles es tan fácil como agregarlos a la matriz.
petergate(roles: [:admin, :editor], multiple: false)
Métodos de instancia
user.role => :editor
user.roles => [:editor, :user]
user.roles=(v) #sets roles
user.available_roles => [:admin, :editor]
user.has_roles?(:admin, :editors) # returns true if user is any of roles passed in as params.
Sintaxis de acceso del controlador.
access all: [:show, :index], user: {except: [:destroy]}, company_admin: :all
Para controlar el acceso a las acciones que recomendaría Action Access , se reduce a esto:
class UsersController < ApplicationController
let :admin, :all
let :user, [:index, :show]
# ...
end
Esto bloqueará automáticamente el controlador, permitiendo a los administradores acceder a cada acción, los usuarios solo mostrarán o indexarán a los usuarios y cualquier otra persona será rechazada y redirigida con una alerta.
Si necesita más control, puede usar not_authorized!
Dentro de las acciones para comprobar y rechazar el acceso.
Es completamente independiente del sistema de autenticación y puede funcionar sin modelos de User
o roles predefinidos. Todo lo que necesita es establecer el nivel de autorización para la solicitud actual:
class ApplicationController < ActionController::Base
def current_clearance_level
session[:role] || :guest
end
end
Puede devolver lo que su aplicación necesite aquí, como current_user.role
por ejemplo.
Aunque no es obligatorio, agrupa un conjunto de adiciones de modelos útiles que permiten hacer cosas como:
<% if current_user.can? :edit, :team %>
<%= link_to ''Edit team'', edit_team_path(@team) %>
<% end %>
Aquí :team
refiere a TeamsController
, por lo que el enlace solo se mostrará si el usuario actual está autorizado para acceder a la acción de edit
en TeamsController
. También soporta espacios de nombres .
Puede bloquear los controladores de forma predeterminada, personalizar la ruta de redirección y el mensaje de alerta, etc.
Es muy sencillo y fácil, espero que lo encuentre útil.
Tu primera suposición fue correcta, usa CanCanCan y serás bueno con eso.
EDITAR 24 de julio de 2015
Llevo mucho tiempo usando cancancan y siempre funcionaba muy bien. Recientemente comencé a trabajar en un proyecto en el que Pundit se utiliza para la autorización.
Es asombroso. Le pide que defina la política para cada recurso y se siente más natural que una clase de Habilidad hinchada.
Para proyectos más grandes, definitivamente recomendaría Pundit.