باستخدام: ATTACCESSIBLE مع إذن يستند إلى الدور
-
16-09-2019 - |
سؤال
في متجرني عبر الإنترنت، يسمح للمستخدمين بتغيير خصائص معينة لأوامرهم (على سبيل المثال، عنوان الفواتير الخاص بهم)، ولكن ليس غيرهم (على سبيل المثال، عنوان IP نشأة). المسؤولون، من ناحية أخرى، يسمح لهم بالتعديل الكل ترتيب الخصائص.
بالنظر إلى ذلك، كيف يمكنني استخدام :attr_accessible
لتأمين نموذج طلبي بشكل صحيح؟ أو هل سأضطر إلى استخدامها لتمييز جميع السمات التي يمكن للمسؤولين تعديلها والامتناع عن استخدامها Order.update_attributes(params[:order])
في تلك الإجراءات المراقبة التي يمكن للمستخدمين العاديين الوصول إليها؟
المحلول
بشكل عام، ATTACCESSIBLE ليست الأداة التي تبحث عنها، ولا تأتي القضبان مع أي شيء بنيت به يفعل ما تريد.
إذا كنت ترغب في إجراء سيطرة رائعة على من الذي يمكنه تحديث سمات محددة في نموذج، فيمكنك فعل شيء مثل:
class Order < ActiveRecord::Base
def update_attributes_as_user(values, user)
values.each do |attribute, value|
# Update the attribute if the user is allowed to
@order.send("#{attribute}=", value) if user.can_modify?(attribute)
end
save
end
end
ثم يمكنك تغيير الخاص بك Order.update_attributes(params[:order])
ل Order.update_attributes_as_user(params[:order], current_user)
والافتراض أنك تنفذ User#can_modify?
طريقة للعودة TRUE في الحالات الصحيحة، يجب أن تعمل.
نصائح أخرى
كان لدي نفس المشكلة والآن أنا أستخدم هذه الأحجار الكريمة http://github.com/dmitry/attr_accessable_block.
إنه سهل ويستخدم في بعض موقع الإنتاج.
نعم، عليك تعديل الإجراءات، لذلك يتم فحص الأذونات داخل الإجراءات. دعا Order#update_attributes
لن تعمل من أجل المستخدم العام.
لا أستطيع أن أنفد مساعد إذن يستند إلى الدور الذي يسمح بشيء ما تبحث عنه. هذا لأن هذه الإضافات mixin إلى وحدات التحكم وليس النماذج. كانوا بحاجة أيضا إلى خلط في ActiveRecord::Base
للتحقق من ذلك attr_accesible
إلخ.