2015-03-19 44 views
2

我在Rails應用程序中運行Pundit進行授權。我似乎已經掌握了這一切,但想知道如何將編輯或更新操作限制到某個字段。授權用戶使用Rails中的專家編輯特定字段

例如,用戶可以編輯他們的user.first_name,user.mobile或user.birthday等,但不能編輯他們的user.role。從本質上講,我的邏輯是,讓用戶編輯任何美觀的東西,但如果它是功能性的則不會。

這些字段只能由具有'super_admin'角色的用戶編輯(我已經使用下面的方法在user.rb上設置了該用戶)。

def super_admin? 
    role == "super admin" 
    end 

    def account? 
    role == "account" 
    end 

    def segment? 
    role == "segment" 
    end 

    def sales? 
    role == "sale" 
    end 

    def regional? 
    role == "regional" 
    end 

    def national? 
    role == "national" 
    end 

    def global? 
    role == "global" 
    end 

我幾乎有一個乾淨的石板user_policy.rb文件,其中更新和編輯行爲是默認

def update? 
    false 
    end 

    def edit? 
    update? 
    end 

也許我的想法完全錯誤的這件事,應該只是包裝一個user.super_admin?如果在用戶展示頁面上的角色字段周圍有聲明,但是如果我只是使用該策略來確保安全性,則會感覺錯誤。

回答

4

在您的觀點中,您可以根據用戶的角色限制用戶可以看到的內容。

用戶查看

而且在政策上,你可以調用用戶的角色,以確保他們能夠編輯。

class UserPolicy 
    attr_reader :current_user, :model 

    def initialize(current_user, model) 
    @current_user = current_user 
    @user = model 
    end 

    def edit? 
    @current_user.super_admin || @current_user == @user 
    end 
end 
+0

難道這種做法是容易形成注射(其中一個糟糕的演員可以在瀏覽器中編輯頁面,添加html代碼以添加角色並提交他們自己的角色?更安全/更好/更清晰的選擇性阻止在任何情況下使用Pundit的allowed_attributes幫助程序與Rails的強大參數一起添加的屬性。 – jpwynn 2017-02-03 03:44:35

1
這是寶石的README頁描述

使用權威人士的permitted_attributes幫手:https://github.com/elabs/pundit

# app/policies/post_policy.rb 
class PostPolicy < ApplicationPolicy 
    def permitted_attributes 
    if user.admin? || user.owner_of?(post) 
     [:title, :body, :tag_list] 
    else 
     [:tag_list] 
    end 
    end 
end 

# app/controllers/posts_controller.rb 
class PostsController < ApplicationController 
    def update 
    @post = Post.find(params[:id]) 
    if @post.update_attributes(post_params) 
     redirect_to @post 
    else 
     render :edit 
    end 
    end 

    private 

    def post_params 
    params.require(:post).permit(policy(@post).permitted_attributes) 
    end 
end 
相關問題