tutorial rails hacer current_user create con como autenticacion ruby-on-rails ruby ruby-on-rails-4 devise admin

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 ayuda sign_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 de config/locales/devise.en.yml se puede cambiar editando el archivo config/locales/devise.en.yml , si lo desea.