โทเค็นผู้ใช้แขกของ Rails Devise

มีแอปรายชื่อโรงแรม Rails พร้อมการตั้งค่า Devise/CanCan

class HotelsController < ApplicationController
before_filter :authenticate_user!, except: [:show]
load_and_authorize_resource

1) วิธีที่หรูหราที่สุดในการอนุญาตให้เจ้าของแก้ไขข้อมูลโรงแรมโดยไม่ต้องลงทะเบียนเป็นผู้ใช้คืออะไร?

2) จะเกิดอะไรขึ้นถ้าเราสร้างโทเค็นที่ไม่ซ้ำกันสำหรับโรงแรมทุกแห่งและส่งอีเมลบางอย่างเช่นลิงก์ต่อไปนี้ไปยังเจ้าของที่เกี่ยวข้อง:

http://myapp.io/hotels/10010/edit?token=AAAABBBBCCCCDDD

..จะกำหนดค่า Devise/CanCan อย่างไรเพื่อให้ตรวจสอบสิทธิ์ผู้ใช้และอนุญาตให้แก้ไขบันทึกที่เกี่ยวข้องในตารางโรงแรมได้

ขอบคุณล่วงหน้า!

ขอแสดงความนับถือเซิร์จ


person Serge    schedule 31.10.2014    source แหล่งที่มา


คำตอบ (1)


วิธีแก้ปัญหาที่รวดเร็วและสกปรกคือการแทนที่วิธี authenticate_user! และเพิ่มการตรวจสอบโทเค็น:

# application_controller.rb
def authenticate_user!
  if (token = params[:token] || session[:token])
    @current_user = User.find_by_token token
    session[:token] = token if @current_user
  else
    super
  end
end

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

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

นอกจากนี้ยังมีอัญมณีบางส่วนที่จะเพิ่มการรับรองความถูกต้องของโทเค็น:

https://github.com/gonzalo-bulnes/simple_token_authentication

และโซลูชัน Rails ในตัวที่เรียบง่าย:

http://api.rubyonrails.org/classes/ActionController/HttpAuthentication/Token.html

person DiegoSalazar    schedule 31.10.2014
comment
เข้าใจแล้ว มันสมเหตุสมผลดี ขอบคุณมาก! - person Serge; 04.11.2014