ruby-on-rails 如何为特定控制器启用访客帐户

44u64gxh  于 2022-11-19  发布在  Ruby
关注(0)|答案(1)|浏览(90)

我正在做的一个项目的实现被卡住了,使用rails7和device,所有的用户都可以登录,所以我有authenticate_user!current_user方法,同样,它们工作得很好。
我已经介绍了一个Customer模型。现在,我不希望客户注册密码等,我希望他们点击一个链接,从我的应用程序发送给他们,然后访问一个页面:

# Observer

class CustomerObserver < ActiveRecord::Observer
  def after_create(customer)
    secret_param = customer.to_sgid(expires_in: nil).to_s
    url = ENV['HOST'] + "?csig=#{secret_param}"

    # Send email with the url...
  end
end

一旦客户单击该链接,他们将进入一个特殊页面,并且只能访问此控制器。
我一直在查看GlobalID,但不确定如何在.to_sgid中使用for: name,以便限制客户只能访问CustomersControllershow操作。
在所有的控制器中,我有before_action :authenticate_user!。第一件事来到我的是overriding that method。感觉不对。如何让客户通过签名链接访问CustomersController,并仍然受到保护,不受未经授权的用户?
我目前正在探索this method,在那里我可能有潜在的客户模型可认证?这意味着有两个登录,一个为user,另一个为customer。如果在/sign_in/路径中有一个为usercustomer的登录就好了。我觉得这篇文章正在改变它的方向。

sczxawaw

sczxawaw1#

像这样的懒检查怎么样;

before_action :authenticate_user!, :if => :check_csig

# ...
private

def check_csig
  # if csig param do not exists, call the authenticate_user!
  true unless params[:csig].exists?

  # if csig param exists and csig is valid do not call the authenticate_user!
  false if check_csig
  true
end

before_action :authenticate_user!, :except =>  [:csgi]
before_action :check_csgi,         :only   =>  [:csgi]

# ...
private

def check_csig
  #check if csgi is valid
end

相关问题