مجوز اصلی ریل (پس از احراز هویت اساسی)

سلام توسعه دهنده سرگرمی برگشته است.
من از نسخه 0.9 ROR انجام داده ام. من چند برنامه نیمه خصوصی مستقر کرده ام و سعی می کنم با نسخه ها کنار بیایم.
وقتی DHH منتشر کرد داربست احراز هویت اساسی من با آن بازی کردم و آن را کار کردم. این مرا آزار داد که چیزهایی در آنجا وجود دارد که من هیچ ایده ای در مورد آنچه انجام می دهم ندارم. مانند:
def start_new_session_for(user)
user.sessions.create!(user_agent: request.user_agent, ip_address: request.remote_ip).tap do |session|
Current.session = session
cookies.signed.permanent[:session_id] = { value: session.id, httponly: true, same_site: :lax }
end
end
هیچ ایده ای ندارید .appap انجام می دهد. به هر حال کار می کند! اکنون به یک چالش جدید – مجوز.
من فقط یک برنامه دارم که نوعی مجوز مبتنی بر نقش دارد. این یک برنامه مدیریت گروه گلف است. این فقط گروه ها ، بازیکنان ، امتیازات ، سهمیه ها و غیره را ردیابی می کرد. من چندین گروه دارم که از آن استفاده می کنند. هر گروه دارای یک کاربر/مدیر است که می تواند هر کاری انجام دهد و چند مورد که می تواند بیشتر کارها را انجام دهد – تیم را تشکیل می دهد – تیم های نمره و غیره. معلوم شد که آنها فقط حساب کاربری را به اشتراک می گذارند و دو یا سه بازیکن دارند که می توانند هر کاری انجام دهند!
من فکر می کنم من طراحی را امتحان کردم اما درد را دوست نداشتم. بعداً Cancan و سپس Cancancan را امتحان کرد. خوب بود ، اما بعد خودم را چرخاندم. کارهای زیادی برای انجام دادن نداشتم ، بنابراین هفته گذشته را صرف چرخیدن نسخه دیگری کردم! فراموش کردم بگویم که من فقط 80 ساله شده ام و کارهای زیادی ندارم. فقط اگرچه من آن را به اشتراک می گذارم.
دقیقاً مانند Cancancan یک طرح توانایی دارد که تعریف می کند چه کسی می تواند چه کاری انجام دهد. در من فقط یک کلاس ثابت در یک کلاس است.
class Can
CRUD = {
super:{
group:'1111',
user:'1111',
player:'1111',
game:'1111',
round:'1111',
article:'1111'
},
manager:{
group:'0110',
user:'1111',
player:'1111',
game:'1111',
round:'1111'
},
trustee:{
group:'0100',
user:'0110',
player:'0110',
game:'0110',
round:'0110',
},
... other roles
}
def self.can(role)
# called from User model - returns user roles
cans = CRUD[role.downcase.to_sym]
end
... some other utilities
end
هش Crud تعریف می کند که از چه نقشه هایی استفاده می شود و هر مدل CRUD چه مدل را اجرا می کند. هر مدل یک رشته 4 کاراکتر از 0 یا 1 را تعریف می کند – که برابر با درست یا نادرست است. نقش مدیر در بالا: نمی تواند یک گروه را ایجاد یا نابود کند ، فقط یک گروه را بخوانید یا به روز کنید. نوع ساده
همه چیز از مدل کاربر کنترل می شود:
class User < ApplicationRecord
has_secure_password
has_many :sessions, dependent: :destroy
normalizes :email_address, with: ->(e) { e.strip.downcase }
attribute :permits
after_initialize :set_attributes
def set_attributes
self.permits = Can.can(self.role) unless self.role.blank?
end
def can?(action,model)
return false if self.role.nil? || self.permits.nil?
action = action.to_s.downcase
model = model.to_s.downcase
permit = permits[model.to_sym]
return false if permit.nil?
if ['create','new'].include?(action)
return permit[0] == '1'
elsif ['index','show','read'].include?(action)
return permit[1] == '1'
elsif ['edit','update'].include?(action)
return permit[2] == '1'
elsif ['delete','destroy'].include?(action)
return permit[3] == '1'
else
return false
end
end
end
مدل کاربر دارای attribute:permits
با فراخوانی تعریف و تنظیم شده و تنظیم شده است set_attributesبشر
set_attributes هش خزنده را برای نقش کاربر استخراج می کند و آن را در ویژگی مجوزها قرار می دهد. برای مدت زمان جلسه وجود دارد.
مجوز در کنترلر مدل یا یک نمای انجام می شود.
شما 9 خط به هر کنترلر اضافه می کنید که قرار است از مجوز استفاده کند:
class UsersController < ApplicationController
before_action :set_auth
before_action :set_user, only: %i[ show edit update destroy ]
# GET /users or /users.json
def index
@users = User.all
end
...
private
def set_auth
if ['index','show','new','edit','create','update','destroy'].include?(params["action"])
permitted = Current.user.can?(params["action"],"user")
unless permitted
redirect_to dashboard_path, alert: "I'm sorry, but you can't do that!"
end
end
end
...
در before_action :set_auth
تماس User.can?
روش با پارامترها[‘action’] و نام مدل فقط اقدامات اساسی CRUD فیلتر می شوند. مطمئن نیستید که آیا اقدامات دیگر باید گنجانده شود؟ یا مورد نیاز ؟؟ به یاد داشته باشید ساده!
در هر دو دوم ، می توانید یک عمل کنترلر را در یک بیانیه IF/Else بسته بندی کنید یا بیانیه شروع/نجات/پایان را انجام دهید. عادل Current.user.can?(:update,:model)
این در کنترلر است که از کسی که وارد سیستم نشده است ، در مرورگر تایپ می کند /article/5/edit
از طرف نمای ، برای مخفی کردن آنها کد را به پیوندها یا دکمه ها اضافه می کنید. شما می توانید یک یاور را به Application_Controller اضافه کنید و از آن استفاده کنید ..
def can?(action,model)
Current.user && Current.user.can?(action,model)
end
helper_method :can?
سپس آن را به پیوندها در نمای اضافه کنید:
div
= link_to icon('fas fa-eye',"Show User"), user,class:"btn-sm-green mr-4"
= link_to icon('fas fa-edit',"Edit User"), edit_user_path(user),class:"btn-sm-orange mr-4" if can?('edit',"user")
بازگشت به مدل کاربر ، قوطی؟ روش با یک عمل و یک مدل خوانده می شود.
این عمل کم و بیش به CRUD تبدیل شده است. اقدامات نمایش و فهرست فقط R در Crud یا خوانده شده است. که در قوطی انجام می شود؟ روش
باز هم من فقط یک توسعه دهنده سرگرمی هستم. این فقط یک تلاش مشترک بود. شاید این ایده ها را به کسی بدهد.