#ruby-on-rails #ruby-on-rails-3 #authorization
#ruby-on-rails #ruby-on-rails-3 #авторизация
Вопрос:
Я использую Devise для аутентификации, и мне нужен только простой администратор или проверка использования для нескольких контроллеров. Я новичок в rails, поэтому я пытаюсь сделать это правильно. Я в основном добавил логическое поле администратора в пользовательскую модель и добавил этот метод
def is_admin?
admin == 1
end
Затем я просто изменил действие контроллера на это
def new
if current_user.nil? || !current_user.is_admin?
flash[:notice] = "You do not have permission to view this page"
redirect_to "/gyms"
else
@gym = Gym.new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @gym }
end
end
end
Итак, это решение работает, но должен ли я делать это по-другому?
Ответ №1:
Это сработает, но я, вероятно, не рекомендовал бы это решение ни для чего другого, кроме небольшого проекта. Со временем, если вы будете выполнять проверки авторизации в своих контроллерах, ваш код станет раздутым и им будет сложно управлять.
Вместо этого я бы рассмотрел возможность использования модуля авторизации, такого как Cancan, который централизует ваши правила авторизации в одном месте и, таким образом, отделяет логику вашего приложения от вашей логики авторизации. Конечный результат — более чистый и поддерживаемый код.
При наличии Cancan ваш код может выглядеть следующим образом:
# app/controllers/gyms_controller.rb
class GymsController < ApplicationController
load_and_autorize_resource
def new
respond_to do |format|
format.html # new.html.erb
format.xml { render :xml => @gym }
end
end
end
end
# app/models/Ability.rb
can :create, Gym do |trip|
user.is_admin?
end