gpt4 book ai didi

ruby-on-rails - 设计-bypass_sign_in 没有active_for_authentication?打回来

转载 作者:行者123 更新时间:2023-12-04 13:02:59 24 4
gpt4 key购买 nike

我在我的应用程序中有非事件帐户的功能来处理这个我覆盖 active_for_authentication?方法如下

def active_for_authentication?
super && activated?
end

但是在我的应用中 super 管理员也可以直接登录其他用户账号,不管是活跃还是不活跃
bypass_sign_in(User.find(resource.id))

我使用上述方法进行旁路登录,它允许我仅为激活的用户直接登录,当我为未激活的用户登录时,它进入无限循环。

解决此问题的任何解决方案或不运行 active_for_authentication?回调时 bypass_sign_in ?

最佳答案

当管理员登录到另一个用户帐户时,您可以在 session 中存储一些额外的数据,这清楚地表明这是 super admin模式。

def login_as(another_user)
return unless current_user.super_admin?

session[:super_admin_mode] = true
bypass_sign_in(another_user)
end

很遗憾,您无法访问 session在 Rails 模型中,但您可以将所需的 session 信息存储在模型中可用的某些每个请求的全局变量中。解决方案可能是这样的:
module SessionInfo
def self.super_user_mode?
!!Thread.current[:super_user_mode]
end

def self.super_user_mode=(value)
Thread.current[:super_user_mode] = value
end
end

在应用程序 Controller 中:
class ApplicationController < ActionController::Base
before_filter :store_session_info

private

def store_session_info
SessionInfo.super_user_mode = session[:super_admin_mode]
end
end

在模型中:
def active_for_authentication?
super && (activated? || SessionInfo.super_user_mode?)
end

此外,您应该确保 :super_admin_mode标志已从 session 中删除当 super 用户退出时。也许它会自动发生,我不确定。也许您需要手动覆盖 Devise::SessionsController#destroy方法(见下面的例子)
  def destroy
session[:super_admin_mode] = nil
super
end

另请阅读本文以更好地了解 devise处理 session Stop Devise from clearing session

关于ruby-on-rails - 设计-bypass_sign_in 没有active_for_authentication?打回来,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50405133/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com