在rails app中适当使用Authority

时间:2016-02-13 01:36:13

标签: ruby-on-rails rolify authority

我遵循Michael Hartl RoR教程,但在此过程中实施了Rollify和Authority。我以前从未使用过权威,我想知道以下的before_action是否适合授权使用

# app/controllers/users_controller.rb 
class UsersController < ApplicationController
  before_action :logged_in_user, only: [:edit, :update]
  .
  .
  .
  private

    def user_params
      params.require(:user).permit(:name, :email, :password,
                                   :password_confirmation)
    end

    # Before filters

    # Confirms a logged-in user.
    def logged_in_user
      unless logged_in?
        flash[:danger] = "Please log in."
        redirect_to login_url
      end
    end
end
是不是&#34;良好的编程习惯&#34;将def logged_in_user放在ApplicationAuthorizer类中以备将来使用?

1 个答案:

答案 0 :(得分:1)

  

是不是&#34;良好的编程习惯&#34;将logged_in_user放入ApplicationAuthorizer

没有

AuthenticationAuthorization之间有一个difference

  • 身份验证 - 用户登录?
  • 授权 - 用户可以吗?

差异很微妙但很重要 - 您希望在授权之前进行身份验证,或者至少是独立的。

一个很好的类比是身份验证是指您访问秘密方(密码); 授权是您可以坐在哪个表格。

如果您使用了其中一个预先滚动的身份验证系统(DeviseSorcery),那么您需要处理您的身份验证,为您提供user_signed_in?等帮助程序

要回答您的问题,考虑到您已推出自己的身份验证,您当前的模式就足够了。

如果您使用Devise,则需要使用以下内容:

#config/routes.rb
authenticate :user do
  resource :profile, controller: :users, only: [:show, :update] #-> url.com/profile
end

#app/controllers/users_controller.rb
class UsersController < ApplicationController
  def show
    @user = current_user
  end

  def update
    @user = current_user.update update_params
  end
end

-

您尝试做的是评估@user.idcurrent_user.id

#app/models/user.rb
class User < ActiveRecord::Base
  include Authority::UserAbilities
  before_action :logged_in_user, only: [:edit, :update]

  def edit
     @user = User.find params[:id]
     redirect_to root_path, notice: "Can't edit this user" unless current_user.can_edit?(@user)
  end

  def update
    @user = User.find params[:id]
    if current_user.can_update?(@user)
       @user.update ...
    else
      # redirect
    end
  end

  private

  def logged_in_user
    redirect_to login_url, error: "Please log in." unless logged_in?
  end
end

# app/authorizers/user_authorizer.rb
class UserAuthorizer < ApplicationAuthorizer

  def self.editable_by?(user)
    user.id = self.id
  end

  def self.updatable_by?(user)
    user.id = self.id
  end
end