2016-03-03 1 views
1
  • У меня Devise Admin & Devise User;
  • Я хочу использовать пространства имен;

То, что я хочу добиться:Devise crud + namespaces: Pro level :)

только
  • изобрести администратор может создать пользователя
  • registerable DEViSE для пользователя не удаляются, так что он может изменить только страницу
  • пользователь может видеть только current_user/показать страницу

То, что я

маршруты:

Rails.application.routes.draw do root :to => 'dashboard#index' 
    devise_for :users, controllers: { registrations: 'user_registrations' } 
    devise_for :admins, controllers: { registrations: 'admin_registrations' } 
    get 'dashboard/index' 
    namespace :admin do 
    root 'dashboard#index' 
    resources :users 
    end 

user_registration_controller:

class UserRegistrationsController < Devise::RegistrationsController 
end 

users_controller:

class UsersController < ApplicationController 

    def index 
    @users = User.all 
    end 
    def show 
    @user = User.find(params[:id]) 
    end 
    def new 
    @user = User.new 
    end 
    def edit 
    end 
    def create 
    @user = User.new(user_params) 
    respond_to do |format| 
     if @guest.save 
     format.html { redirect_to users_path } 
     else 
     format.html { render :new } 
     end 
    end 
    end 
    def update 
    respond_to do |format| 
     if @user.update(user_params) 
     format.html { redirect_to @user } 
     else 
     format.html { render :edit } 
     end 
    end 
    end 
    def destroy 
    user = User.find(params[:id]) 
    user.destroy 
    redirect_to users_path 
    end 

    private 
    def set_user 
     @user = User.find(params[:id]) 
    end 
    def user_params 
     params.require(:user).permit(:email, :password, :password_confirmation) 
    end 
end 

+ У меня есть взгляды пользователей, как они будут в нормальном эшафот.

=> С помощью этой установки, любой пользователь может создать пользователю

Любые идеи, как решить вопросы на вершине? ..

ответ

0

Не использовать отдельные классы пользователей с Завещания, использовать роли вместо этого. Разработать только для аутентификации одного класса, в то время как вы можете взломать его, используя два класса, это беспорядок. Вы должны переопределить всю логику сериализации/десериализации пользователей из сеанса, среди прочего, чтобы разработчик знал, должен ли он загружать класс Admin или User.

Его также плохое решение, так как вы надавите на авторизации проблемы в аутентификации слоя. Задача Разработчика состоит в том, чтобы убедиться, что пользователь - это то, кем она/она утверждает, что является небольшим подвигом. Авторизация, с другой стороны, это правила о том, что пользователь может сделать. «Только администраторы могут создавать пользователей» - это четкое разрешение авторизация правило.

Простейшая возможная роль авторизация будет что-то вроде этого:

class AddRoleToUser < ActiveRecord::Migration 
    def change 
    add_column :users, :role, :integer, default: 0 
    add_index :users, :role 
    end 
end 

class User 
    # ... 
    enum role: [:visitor, :admin] 
end 

Мы используем enum, который один столбец битовой маски для хранения роли пользователей.Объявив его как столбец перечислений также дает нам несколько способов бесплатно:

user.visitor? 
user.admin? 
user.admin! 

Так позволяет создать базовую проверку авторизации:

def create 
    unless current_user.admin? 
    redirect_to root_path, status: 401, error: 'You are not authorized to perform this action' and return 
    end 

    # ... 
end 

Но мы не хотим повторять, что каждый раз, когда мы хотим санкционировать, так что позволяет очистить его:

class AuthorizationError < StandardError; end 

class ApplicationController 

    rescue_from AuthorizationError, with: :deny_access! 

    private 

    def authorize_admin! 
     raise AuthorizationError, unless current_user.admin? 
    end 

    def deny_access! 
     redirect_to root_path, 
      status: 401, 
      error: 'You are not authorized to perform this action' 
    end 
end 

Итак, мы можем настроить контроллер с фильтром, чтобы проверить разрешение перед выполнением действий:

class UsersController < ApplicationController 
    before_action :authorize_admin!, except: [:show] 

    # ... 
end 

Однако вместо того, чтобы изобретать колесо, вы можете захотеть взглянуть на Pundit или CanCanCan, которые являются твердыми библиотеками авторизации с большими сообществами. Вы также можете посмотреть на Rolify.

+0

Подход, основанный на авторизации, который вы описываете, замечательный, однако я предполагал пойти с разными 'Devise admin' &' Devise user', потому что позже они будут иметь разные ассоциации с другими моделями ('scaffold event title admin: reference starts_at : date', 'scaffold посещаемость событие: ссылки пользователь: ссылки',' scaffold назначение admin: ссылки пользователь: ссылки start_at: date' ... – makerbreaker

+0

Я бы действительно не советовал, что вы можете установить отношения просто отлично с одним пользователем class. Если вы хотите вызвать отношение 'belongs_to:: admin', вы можете просто предоставить опцию' class_name'. Я думаю, вы недооцениваете, насколько сильно это испортит вам систему авторизации, вы можете в основном разработать систему, если вы идете вниз этот маршрут. Кроме того, его не рекомендуется использовать строительные леса, кроме прототипа в шипе. Вы легко обойдете себя, создав путь к человеку y действий/представлений и т. д., которые не были должным образом заблокированы или протестированы. – max

+0

Благодарим вас за руководство. Я думаю, что я каким-то образом попробую вариант 2-devise-model + namespace, а auth gems + одна модель будет следующей :). – makerbreaker