возможность cancan: разрешить администратору сайта с ролью rolify create_user создавать или регистрировать новых пользователей devise

Для приложения я пытаюсь реализовать доступ в стиле job_code, используя канкан/канканкан, разработку и преобразование.

Только администраторы сайта с job_code :create_user смогут создавать новых пользователей.

Ниже приведен код:

class RegistrationsController < Devise::RegistrationsController 
    before_filter :check_permissions, :only => [ :new, :create, :cancel ] 
    skip_before_filter :require_no_authentication 

    def check_permissions
        authorize! :create, resource
    end
end

class Ability
  include CanCan::Ability

  def initialize(user)
     alias_action :create, :read, :update, :destroy, :to => :crud

     if user.has_role? :create_user 
        can :create, User
     end

     if user.has_role? :create_annoucement
       can :create, Announcement
     end
  end
end

в route.rb у меня есть

devise_for :users ,:controllers => { :registrations => "registrations" }, :path_names => {:sign_in => "login", :sign_out => "logout"}, :path => "account"

Контроллер приложений

class ApplicationController < ActionController::Base
    # Prevent CSRF attacks by raising an exception.
    # For APIs, you may want to use :null_session instead.
    protect_from_forgery with: :exception
    before_action :authenticate_user!
    check_authorization unless: :devise_controller?
    before_filter :set_start_time if Rails.env.development?
    before_action :configure_permitted_parameters, if: :devise_controller?

    rescue_from CanCan::AccessDenied do |exception|
      #https://github.com/ryanb/cancan/wiki/Devise
        if current_user.nil?
            session[:next] = request.fullpath
            puts session[:next]
            redirect_to new_user_session_path, :alert => "You have to log in to continue."
        else
          render file: "#{Rails.root}/public/403", formats: [:html], status: 403, layout: false
        end
    end

    def set_start_time
        @start_time = Time.now.usec
    end

    def configure_permitted_parameters
            #devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:name, :email) }
        devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:first_name, :last_name, :email, :password, :password_confirmation) }
          devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:first_name, :last_name, :email, :password, :password_confirmation, :current_password, :user_manual) }
      end

end

Когда я использую следующий код в Ability.rb

if user.has_role? :create_user 
        can :create, :all
end

он работает отлично. Это приводит меня на страницу регистрации пользователя

но когда у меня есть этот код

if user.has_role? :create_user 
   can :create, User
end

отказано в доступе (страница 403)

Мне трудно понять, что мне следует использовать вместо Пользователь в can :create, User


person gkolan    schedule 06.01.2015    source источник


Ответы (1)


Мне пришлось добавить :read вместе с :create разрешениями для доступа к новым/созданным действиям, а затем разобрать :read доступ

person E. Ro    schedule 20.01.2017