2015-04-13 2 views
0

Мне сложно понять сильные параметры. Я понимаю, что это предотвращает массовое присвоение переменных, которые вы не позволяете. Но в Hartl's tutorial я также читал, что без сильных параметров кто-то может изменить, например, любой пользовательский статус администратора через запрос патча (который, я думаю, не является массовым назначением, потому что это только одно значение, которое вы изменили бы). Но тогда как же реализовать сильный Params для переменных:Обоснование сильных параметров и переменных, допустимых только для некоторых пользователей

  • Должен быть разрешен только установить один раз (при создании нового пользователя)
  • Некоторых пользователей должны быть в состоянии изменить, но другие не

Например, у меня есть:

private 
    def user_params 
     params.require(:user).permit(:email, 
            :username, 
            #:verified, 
            #:admin, 
            #:moderator, 
            #:activated, 
            #:activated_at, 
            :password, 
            :password_confirmation) 
    end 

Теперь те, с тиром я понимаю, не должны быть разрешены. В противном случае пользователи могут изменять свои значения посредством массового присвоения (или иначе).

Однако:

  • административного пользователя (который является конкретным пользователем из тех же таблиц/контроллера) должны иметь возможность изменить эти переменные для всех пользователей.
  • В случае с моим приложением организации (другая таблица) должны иметь возможность предоставлять права модератора пользователя и, таким образом, изменять эти значения для пользователей.
  • Имя пользователя должно быть установлено только при создании нового пользователя и после этого никогда не должно быть разрешено изменять. Теперь, разрешив имя пользователя в strong_params, это не означает, что он уязвим для изменения посредством массового присвоения?

Как сильные параметры относятся к этим проблемам?

+0

Я никогда не занимался этим, но мое мнение по моему опыту: у 'user_params' может быть условие, которое проверяет разрешения' current_user' и устанавливает атрибуты 'allow' на основе этого условного. –

+0

Что касается изменения имени пользователя, я бы справился с этим в модели или имел 'new_user_params'. –

ответ

0

Хотя самый простой случай для user_params всегда делать то же самое и использоваться всеми вызовами update_attributes, что это всего лишь простейший случай ,

Совершенно разумно разрешать на основе привилегий текущего пользователя или иметь разные списки разрешений для разных действий (поэтому, возможно, только список разрешений, используемый в действии на создание, разрешает :username).

Еще один шаблон, который вы могли бы рассмотреть, - это пространство имен Admin для тех, у кого есть административный доступ: Admin::UsersController позволит больше изменять типы полей и может предоставить больше функциональных возможностей или данных, к которым обычный пользователь не должен иметь доступ.

+0

Таким образом, было бы полезно определить в контроллере 'def edit' с оператором' if', где он устанавливает @users на основе разных «сильных параметров», если его admin и 'else' использует второй более строгий сильный params'. То есть, нет необходимости определять два разных 'def edits', это можно сделать с помощью инструкции if else? – Nick

+0

@ Ник звучит отлично –

0

Я не эксперт, но насколько я могу понять: когда вы настраиваете сильные параметры, вы обычно контролируете, что передается в метод update_attributes/create. Таким образом, вы определяете, что выживает в:

params[:user][ ... ] 

В случае admin обновления user, вам не нужно POST всего объекта пользователя, вы можете просто сделать вызов определенной функции, которая будет меняться в зависимости от того, какие атрибуты вы хотите изменить: user. Другими словами:

$.ajax(
    { "method": "PUT", "url": "https://stackoverflow.com/users/" + uid }, 
    { "task": "make_admin" } 
); 

И в контроллере:

def update 
    if params[:task] == "make_admin" && user_is_authorized 
    User.find(params[:id]).admin = true 
    end 
end 
Смежные вопросы