2015-03-19 2 views
2

Я использую Pundit в приложении Rails для авторизации. Кажется, я все-таки получаю от этого зависание, но хочу знать, как ограничить действия редактирования или обновления определенным полем.Разрешить пользователю редактировать конкретное поле с помощью Pundit in 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-код, чтобы добавить роль и отправить свою собственную роль? Safer/Better/Cleaner, чтобы выборочно блокировать добавление атрибута при любых обстоятельствах с помощью помощника Pundit allowed_attributes в сочетании с сильными параметрами Rails. – jpwynn

1

Используйте Пандит в permitted_attributes помощник, который описан на странице README драгоценного камня: 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 
Смежные вопросы