Должен ли я пропустить авторизацию, с Канканским действием, которое создает ресурс?
-
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 для случайных действий. Мой пример выше должен решить вашу проблему