ruby on rails - hacer - Permitir solo al usuario administrador crear nuevos usuarios en Rails con Devise(sin módulos externos)
devise tutorial rails (3)
El problema es conceptual Devise es solo una biblioteca de autenticación, no una biblioteca de autorización. Tienes que implementar esto por separado o usar CanCan. Sin embargo, no se preocupe, es fácil en su caso implementar esto ya que solo tiene un rol.
Proteja su usuario crear / actualizar / destruir acción con un filtro de antes:
class UsersController < ApplicationController
before_filter :authorize_admin, except [:index, :show]
def create
# user create code (can''t get here if not admin)
end
end
class ApplicationController < ActionController::Base
def authorize_admin
redirect_to root_path, alert: ''Access Denied'' unless current_user.admin?
end
end
Con este enfoque simple, ejecute un filtro de antes en cualquier acción del controlador que pueda afectar el registro de un usuario, primero verificando si el usuario es un administrador y expulsándolo a la página de inicio si no es así.
Actualmente, mi base de datos de usuarios tiene una columna llamada "admin" con un valor booleano y el valor predeterminado es false. Tengo un usuario administrador sembrado en la base de datos.
¿Cómo escribo mi aplicación para que los usuarios que son el administrador puedan crear nuevos usuarios, pero los usuarios que no lo son no puedan? (Además, los usuarios deben ser creados solo por el administrador)
Parece que debe haber una manera simple de hacer esto en el diseño que no implique el uso de algún módulo externo. Hasta ahora, sin embargo, no he podido encontrar una respuesta satisfactoria.
Sería más probable que marcara la solución que solo está diseñada. (Uno que es simplemente una solución estándar de MVC / Rails a más) Sin embargo, si realmente hay una mejor manera de hacerlo que no involucre a CanCan, también puedo aceptarlo.
NOTA:
He estado buscando por un tiempo y he encontrado muchas otras preguntas de stackoverflow que son muy similares a esta, pero o bien no responden bien la pregunta, o usan otros módulos que no son de diseño. (O ambos)
Para implementar la autorización, use un método en el controlador
Exactamente como lo sugirió @ diego.greyrobot
class UsersController < ApplicationController
before_filter :authorize_admin, only: :create
def create
# admins only
end
private
# This should probably be abstracted to ApplicationController
# as shown by diego.greyrobot
def authorize_admin
return unless !current_user.admin?
redirect_to root_path, alert: ''Admins only!''
end
end
Para eludir el problema "Identificar ya iniciado", defina una nueva ruta para crear usuarios.
Simplemente definiremos una nueva ruta para manejar la creación de usuarios y luego enviaremos el formulario a esa ubicación. De esta forma, el envío del formulario no pasa por el controlador de diseño para que pueda usarlo libremente en cualquier lugar que desee de la manera normal.
# routes.rb
Rails.application.routes.draw do
devise_for :users
resources :users, except: :create
# Name it however you want
post ''create_user'' => ''users#create'', as: :create_user
end
# users/new.html.erb
# notice the url argument
<%= form_for User.new, url: create_user_path do |f| %>
# The form content
<% end %>
Este parece ser el enfoque simplista. Solo requiere subclasificar el controlador de diseño. Vea los documentos para saber cómo hacer eso.
# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
before_action :authenticate_user!, :redirect_unless_admin, only: [:new, :create]
skip_before_action :require_no_authentication
private
def redirect_unless_admin
unless current_user.try(:admin?)
flash[:error] = "Only admins can do that"
redirect_to root_path
end
end
def sign_up(resource_name, resource)
true
end
end
# config/routes.rb
Rails.application.routes.draw do
devise_for :users, :controllers => { :registrations => ''registrations''}
end
Explicación
- Subclase el controlador de registro y cree la ruta para él.
-
before_action
garantiza que un usuario inicie sesión y los redirecciona, a menos que sea administrador, si intentan registrarse. - El problema ya iniciado es causado por el método
require_no_authentication
de Devise y omitirlo resuelve el problema. - Lo siguiente es que el usuario recién creado
sign_up
automáticamente. El método de ayudasign_up
que hace esto se reemplaza para evitar el registro automático. - Finalmente, la
Welcome! You have signed up successfully.
Welcome! You have signed up successfully.
el mensaje flash deconfig/locales/devise.en.yml
se puede cambiar editando el archivoconfig/locales/devise.en.yml
, si lo desea.