rails cancancan ability ruby-on-rails ruby ruby-on-rails-4 authorization cancan

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.