2016-02-13 19 views
1

我遵循Michael Hartl RoR教程,但一直在實施Rollify和Authority。我從來沒有使用之前管理局和我想知道如果下面before_action適合管理局使用在Rails應用程序中適當使用Authority

# 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 

會是「良好的編程習慣」把def logged_in_user以備將來使用ApplicationAuthorizer類裏面呢?

回答

1

難道是 「良好的編程習慣」 把logged_in_userApplicationAuthorizer

有一個和Authorizationdifference之間Authentication

  • 身份驗證 - 用戶登錄?
  • 授權 - 可否將用戶這個?

的區別是微妙而重要的 - 你所期望的認證之前授權發生,或至少獨立完成。

一個很好的比喻是身份驗證是當你得到一個祕密聚會(密碼)的訪問; 授權是您可以坐在哪張桌子上。

如果使用的是預軋認證系統(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