برنامه نویسی

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

سلام توسعه دهنده سرگرمی برگشته است.

من از نسخه 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 یا خوانده شده است. که در قوطی انجام می شود؟ روش

باز هم من فقط یک توسعه دهنده سرگرمی هستم. این فقط یک تلاش مشترک بود. شاید این ایده ها را به کسی بدهد.

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا