Rails: "current_user" ที่น่าอับอายมาจากไหน


94

ฉันได้รับการมองไปรอบ ๆ เมื่อเร็ว ๆ current_userนี้ทางรถไฟและแจ้งให้ทราบว่ามีจำนวนมากที่มีการอ้างอิงถึง สิ่งนี้มาจาก Devise เท่านั้นหรือ? และฉันต้องกำหนดเองด้วยตัวเองแม้ว่าฉันจะใช้ Devise? มีข้อกำหนดเบื้องต้นในการใช้current_user(เช่นการมีอยู่ของเซสชันผู้ใช้ ฯลฯ ) หรือไม่

คำตอบ:


83

มันถูกกำหนดโดยอัญมณีหลายชนิดเช่น Devise

คุณจะต้องจัดเก็บ user_id ไว้ที่ใดที่หนึ่งโดยปกติจะอยู่ในเซสชันหลังจากเข้าสู่ระบบนอกจากนี้ยังถือว่าแอปของคุณมีและต้องการผู้ใช้การตรวจสอบสิทธิ์ ฯลฯ

โดยทั่วไปแล้วจะมีลักษณะดังนี้:

class ApplicationController < ActionController::Base
  def current_user
    return unless session[:user_id]
    @current_user ||= User.find(session[:user_id])
  end
end

#{Rails.root}/app/models/user.rbนี้อนุมานว่าระดับผู้ใช้ที่มีอยู่เช่น

อัปเดต: หลีกเลี่ยงการสืบค้นฐานข้อมูลเพิ่มเติมเมื่อไม่มีผู้ใช้ปัจจุบัน


เซสชันเป็นเหมือนคอนโทรลเลอร์ / โมเดลที่ใช้กันทั่วไปเพื่อวัตถุประสงค์ในการควบคุมสถานะการเข้าสู่ระบบของผู้ใช้หรือไม่ หรือสร้างเป็นราง?
bigpotato

sessionถูกสร้างขึ้นใน Rails โดยค่าเริ่มต้นจะใช้คุกกี้เพื่อรักษาสถานะของลูกค้าระหว่างคำขอ ดูข้อมูลเพิ่มเติมได้ที่guide.rubyonrails.org/security.html#sessions
Erik Peterson

2
หมายเหตุ: หากคุณกำลังอ่านคำตอบนี้อย่าลืมรวมreturn unless session[:user_id]ตามที่แสดงไว้ในคำตอบของ Zach - หากไม่มีการif current_userตรวจสอบทุกครั้งที่ออกจากระบบจะเรียกใช้การสืบค้นฐานข้อมูลอื่น
DreadPirateShawn

10

ใช่การใช้งานcurrent_user sessionคุณสามารถทำสิ่งที่คล้ายกันในตัวควบคุมแอปพลิเคชันของคุณหากคุณต้องการม้วนการตรวจสอบสิทธิ์ของคุณเอง:

def current_user
  return unless session[:user_id]
  @current_user ||= User.find(session[:user_id])
end

เซสชันเป็นเหมือนคอนโทรลเลอร์ / โมเดลที่ใช้กันทั่วไปเพื่อวัตถุประสงค์ในการควบคุมสถานะการเข้าสู่ระบบของผู้ใช้หรือไม่ หรือสร้างเป็นราง?
bigpotato

1
sessionมีลักษณะคล้ายparamsกันยกเว้นว่ายังคงมีอยู่สำหรับคำขอหลายรายการ คุณสามารถใช้เพื่อจัดเก็บพารามิเตอร์ถาวรประเภทใดก็ได้ที่ไม่ซ้ำกับผู้ใช้แต่ละรายของคุณ (จนกว่าเซสชันจะหมดอายุหรือออกจากระบบ) คุณสามารถอ่านเพิ่มเติมได้ที่นี่: ActionController: Accessing the Session
Zach Kemp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.