Solución:
Tu primera suposición fue correcta, usa cancancan y estarás bien con eso.
EDITAR 24 de julio de 2015
He estado usando cancancan durante mucho tiempo y siempre funcionó muy bien. Recientemente comencé a trabajar en un proyecto en el que se usa Pundit 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.
Para controlar el acceso a las acciones, 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, lo que permitirá a los administradores acceder a cada acción, a los usuarios solo mostrar o indexar a los usuarios y cualquier otra persona será rechazada y redirigida con una alerta.
Si necesita más control, puede usar not_authorized!
acciones internas para verificar y rechazar el acceso.
Es completamente independiente del sistema de autenticación y puede funcionar sin User
modelos 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 necesite la aplicación aquí, como current_user.role
por ejemplo.
Aunque no es obligatorio, incluye un conjunto de útiles adiciones de modelos que permiten hacer cosas como:
<% if current_user.can? :edit, :team %>
<%= link_to 'Edit team', edit_team_path(@team) %>
<% end %>
Aquí :team
se refiere a TeamsController
, por lo que el enlace solo se mostrará si el usuario actual está autorizado para acceder al edit
acción en TeamsController
. También es compatible 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.
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 Devise.
A continuación se muestran algunos ejemplos del archivo Léame.
Si está utilizando devise, 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 al controlador.
access all: [:show, :index], user: {except: [:destroy]}, company_admin: :all