Rails - อนุญาตให้เข้าถึงการดำเนินการของคอนโทรลเลอร์เฉพาะฝั่งเซิร์ฟเวอร์เท่านั้น

ฉันมีโครง users และ projects ในโครงการ Rails ของฉัน ฉันยังมีตัวควบคุม admin และมุมมองที่สามารถเข้าถึงได้โดยผู้ใช้ที่เป็นผู้ดูแลระบบเท่านั้น ฉันต้องการให้การดำเนินการของคอนโทรลเลอร์ index และ create สำหรับโมเดล users และ projects สามารถเข้าถึงได้ในมุมมอง admin เท่านั้น (โดยใช้ render :partial > 'index') แต่ฉันไม่ต้องการให้ผู้เยี่ยมชมไซต์สามารถพิมพ์ใน http://railsapp.host/users และรับการแสดงผลบางส่วน . ฉันจะบรรลุเป้าหมายนี้ได้อย่างไร?

เพื่อชี้แจงให้กระจ่าง ปัญหาของฉันไม่เกี่ยวกับบทบาทของผู้ใช้ ฉันมี authlogic พร้อมตัวช่วย need_admin ทั้งหมด แต่ฉันไม่ต้องการให้ผู้ใช้ที่เป็นผู้ดูแลระบบสามารถเข้าถึงเส้นทาง index สำหรับ users ได้โดยตรงจากเบราว์เซอร์ ฉันต้องการจำกัดการกระทำของคอนโทรลเลอร์ index ไว้เฉพาะโค้ดมุมมอง admin#index ดังนี้:

<%= render '/users/index' %>

person pvenky    schedule 03.11.2012    source แหล่งที่มา
comment
วิธีที่ง่ายที่สุดอธิบายไว้ที่นี่: guides.rubyonrails.org/   -  person jdoe    schedule 03.11.2012


คำตอบ (4)


วิธีที่ดีที่สุดคือกำหนดตัวกรองในตัวควบคุมแอปพลิเคชัน

 class UsersController < ApplicationController
   before_filter :check_isadmin?, :only => [:create, :index]
 end
 class ProjectsController < ApplicationController
   before_filter :check_isadmin?, :only => [:create, :index]
 end
 class ApplicationControlloller < ApplicationController
   def check_isadmin?
      current_user.admin?
    end
end
person Aayush Khandelwal    schedule 03.11.2012
comment
ขอบคุณสำหรับการตอบรับ ฉันไม่ชัดเจนในคำถามของฉัน - ฉันเพิ่งแก้ไข โปรดดูการแก้ไข - person pvenky; 03.11.2012

หากคุณใช้บทบาทสำหรับผู้ใช้รายอื่น คุณสามารถตรวจสอบบทบาทของผู้ใช้ที่เป็นผู้ดูแลระบบ จากนั้นแสดงผลบางส่วนได้ เช่น:

<% if user.isAdmin? %>
  <%= render 'index' %>
<% end %>
person Thanh    schedule 03.11.2012
comment
ขอบคุณสำหรับการตอบรับ ฉันไม่ชัดเจนในคำถามของฉัน - ฉันเพิ่งแก้ไข โปรดดูการแก้ไข - person pvenky; 03.11.2012
comment
ฉันยังไม่เข้าใจว่าคุณต้องการทำอะไร แต่ถ้าคุณต้องการกำหนดความสามารถของผู้ใช้ คุณสามารถลอง สามารถ สามารถอัญมณีได้ - person Thanh; 03.11.2012
comment
ฉันมีการกระทำของคอนโทรลเลอร์ users#index ที่แสดงผลบางส่วน แต่บางส่วนนี้ถูกฝังอยู่ในมุมมอง admin#index ฉันไม่ต้องการให้ใครสามารถพิมพ์ https://localhost/users และรับบางส่วนได้ ฉันต้องสามารถแยกแยะได้ในตัวควบคุมผู้ใช้ของฉันว่าคำขอนั้นมาจากที่อยู่เว็บที่พิมพ์ลงในเบราว์เซอร์โดยตรง หรือมาระหว่างการแสดงผลการกระทำ admin#index - person pvenky; 03.11.2012

โอเค ฉันควรจะบอกว่าฉันเป็นญาติกับรางรถไฟ ฉันคิดออกแล้ว ฉันคิดว่า

<%= render '/users/index' %>

จริงๆ แล้วต้องผ่านรหัส users#index ฉันเพิ่งรู้ว่ามันเป็นเพียงการเรียกบางส่วนภายใต้มุมมองโดยไม่ต้องผ่านการกระทำของคอนโทรลเลอร์ ดังนั้นฉันจึงเพิ่มสิ่งนี้ลงในคอนโทรลเลอร์ users

def index
  redirect_to :controller=>'admin', :action=>'index'
end

และดูเหมือนว่าจะบรรลุเป้าหมายที่ฉันต้องการ

ขอบคุณสำหรับความช่วยเหลือทั้งหมดของคุณ

person pvenky    schedule 03.11.2012

การเสริมคำตอบของ Aayush Khandelwal ซึ่งมีประโยชน์สำหรับฉัน before_filter จะเสื่อมค่าใน Rails 5 ใช้ before_action แทน

class UsersController < ApplicationController
   before_action :check_isadmin?, :only => [:create, :index]
end

และใน :check_isadmin? เปลี่ยนเส้นทางไปยังหน้าอื่นหากเป็นเท็จ

def check_isadmin?
  if current_user == nil || !current_user.admin?
    redirect_to root_path
  end
end 
person Gonzalo    schedule 13.06.2017