Nano Hash - криптовалюты, майнинг, программирование

Разрешить пользователю редактировать конкретное поле с помощью Pundit в 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? if вокруг поля роли на странице показа пользователя, но это кажется неправильным, если я использую эту тактику только для безопасности.


Ответы:


1

Используйте помощник Pundit по разрешению_атрибутов, который описан на странице 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
03.02.2017

2

В своих представлениях вы можете ограничить то, что могут видеть пользователи, в зависимости от их роли.

Просмотр пользователя

- if current_user.super_admin? 
  = f.select(:role, User.roles.keys.map {|role| [role.titleize.role]})
- else
  = user.role

А в политике можно назвать роль пользователя, чтобы убедиться, что он может редактировать.

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
19.03.2015
  • Разве этот подход не будет восприимчив к внедрению формы (когда злоумышленник может отредактировать страницу в браузере, добавить html-код, чтобы добавить роль и отправить свою собственную роль? Безопаснее/лучше/чище, чтобы выборочно блокировать добавление атрибута ни при каких обстоятельствах не используйте помощник Pundit по разрешению_атрибутов в сочетании с сильными параметрами Rails. 03.02.2017
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..