Должен ли я пропустить авторизацию, с Канканским действием, которое создает ресурс?

StackOverflow https://stackoverflow.com/questions/2831720

  •  26-09-2019
  •  | 
  •  

Вопрос

Я пишу веб-приложение, чтобы выбрать случайные списки карт из более крупных, комплектующих карт. У меня есть модель карты и модель карты. Обе модели имеют полный успокоительный набор из 7 действий (: индекс: New,: Show и etc). CardsEtsController имеет дополнительные действия для создания случайных наборов: :random.

# app/models/card_set.rb
class CardSet < ActiveRecord::Base
  belongs_to :creator, :class_name => "User"
  has_many :memberships
  has_many :cards, :through => :memberships

# app/models/card.rb
class Card < ActiveRecord::Base
  belongs_to :creator, :class_name => "User"
  has_many :memberships
  has_many :card_sets, :through => :memberships

Я добавил разработку для аутентификации и Cancan для разрешений. У меня есть пользователи с ролью «редактора». Редакторы разрешено создавать новые карты. Гостевые пользователи (пользователи, которые не вошли в систему) могут использовать только :index и :show Действия. Эти разрешения работают как разработанные. Редакторы в настоящее время могут использовать оба :random и то :new действия без каких-либо проблем. Пользователи гостей, как и ожидалось, не могут.

# app/controllers/card_sets_controller.rb
class CardSetsController < ApplicationController
  before_filter :authenticate_user!, :except => [:show, :index]
  load_and_authorize_resource

Я хочу разрешить гостям пользователям использовать :random действие, но не :new действие. Другими словами, они могут видеть новые случайные наборы, но не сохраняют их. Кнопка «Сохранить» на :random Вид действий скрыт (как разработан) от гостевых пользователей. Проблема в том, что первое, что :random Действие делает создание нового экземпляра модели карты, чтобы заполнить вид. Когда канкан пытается load_and_authorize_resource Новый карту, он бросает Cancan :: AccessDeded исключение. Следовательно, просмотр никогда не загружается, и гостевой пользователь обслуживается «вам нужно войти в систему или зарегистрироваться, прежде чем продолжить» сообщение.

# app/controllers/card_sets_controllers.rb
def random
  @card_set = CardSet.new( :name => "New Set of 10", :set_type => "Set of 10" )

Я понимаю, что могу сказать load_and_authorize_resource пропустить :random действие прохождения :except => :random на звонок, но это просто чувствует "неправильный" по какой-то причине.

Что то "Правильно" способ сделать это? Должен ли я создать новый случайный набор, не создавая новую карту? Должен ли я идти вперед и добавить исключение?

Обновлять

Я не включил свой класс способностей выше. Я обновил его, чтобы включить действие: «Случайное» действие, но он все еще не работает совсем так.

class Ability
  include CanCan::Ability

  def initialize( user )
    user ||= User.new # User hasn't logged in

    if user.admin?
      can :manage, :all if user.admin?
    else
      # All users, including guests:
      can :read, [Card, CardSet]
      can :random, CardSet

      # All users, except guests:
      can :create, [Card, CardSet] unless user.role.nil?
      can :update, [Card, CardSet] do |c|         
        c.try( :creator ) == user || user.editor?
      end

      if user.editor?
        can [:create, :update], [Card, CardSet]
      end
    end
  end
end
Это было полезно?

Решение

Я нашел свою проблему. Канкан не был проблемой вообще! Следующая строка в моем контроллере Cardet Controler выбрасывала исключение и перенаправляя моих гостей (не вошедших в систему) пользователей в журнал страницы:

before_filter :authenticate_user!, :except => [:show, :index]

Я изменил его, чтобы прочитать:

before_filter :authenticate_user!, :except => [:show, :index, :random]

И теперь код работает как предполагаемый: Гостевые пользователи могут просматривать новые случайные наборы, созданные, но не могут «сохранить», если они сначала не входят в систему.

Итак, моя настоящая проблема была с разработкой (или, на самом деле, моя разрабатывающая конфигурация), а не с канем вообще.

Другие советы

Ну, правильные вещи будут использовать класс способностей канкан для определения правильных правил авторизации.

в способности.rb.

  def initialize(user)
#everyone
    can [:read, :random], [CardSet]
#everyone who is editor
    if user.editor?
      can [:new, :create], [CardSet]

и т.д

Проблема в том, что первое, что: Случайное действие - это создает новый экземпляр модели карты для заполнения вида. Когда Cancan пытается загрузить_And_authorize_Resource новую карту, он бросает Cancan :: Accessedied исключение.

В то время как Канкан разрешает действие контроллера, создание нового экземпляра в случайном действии (т.е. cardset.new) не в объеме Канкана. Вы, вероятно, получите ошибку, потому что у вас нет правил, определенных в Somations.rb для случайных действий. Мой пример выше должен решить вашу проблему

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top