Вопрос о простой авторизации

#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