繁体   English   中英

Rails:创建设计会话时出错

[英]Rails: Error when creating devise session

在我的应用程序中,我试图通过设置session_validity_token手动使设计会话不可用。

我该怎么做:

  • devise用户模型具有名为session_validity_token的列
  • 我也有一个SeesionHistory模型,该模型具有相同的列

在我的设计初始化...

Warden::Manager.after_set_user except: :fetch do |user, warden, opts|
  user.update_attribute(:session_validity_token, Devise.friendly_token) if user.session_validity_token.nil?
  warden.raw_session["validity_token"] = user.session_validity_token
end

Warden::Manager.after_fetch do |user, warden, opts|
  unless user.session_histories.unblocked.where(session_validity_token: warden.raw_session["validity_token"]).exists?
    warden.logout
  end
end

...当用户登录或注册时,我将存储的Cookie的validity_token设置为Users session_validity_token 如果用户还没有(注册),我将创建一个令牌。

...当获取URL时,我会在授权用户之前检查是否存在与该令牌的无阻塞会话。 如果不是,则用户注销。

在ApplicationController中...

def after_sign_in_path_for(resource_or_scope)
    session = SessionHistory.create(user_id: current_user.id, session_validity_token: current_user.session_validity_token)
    current_user.update_attribute(:session_validity_token, Devise.friendly_token)

    request.env['omniauth.origin'] || stored_location_for(resource) || root_path
end

...在用户登录后,我创建了一个SessionHistory记录,并将其session_validity_token设置为Users令牌,然后重新创建Users令牌。

不幸的是,我得到以下错误:

Users :: SessionsController#create中的NoMethodError
nil:NilClass的未定义方法`session_validity_token'

这是SessionController#Create操作:

def create
    if User.where("email = '#{params[:user][:login]}' or username = '#{params[:user][:login]}'").exists?
        @user = User.find(User.where("email = '#{params[:user][:login]}' or username = '#{params[:user][:login]}'").first.id)
        if @user.confirmed? || ((Time.now - @user.created_at).to_i / (24 * 60 * 60)) < 1
            super
        else
            redirect_to new_user_confirmation_path(q: "unconfirmed")
        end
    else
        flash[:alert] = "The email or username does not match any accounts"
        redirect_to new_user_session_path
    end
end

所以我想用Warden处理令牌时我做错了...

请询问您是否需要其他信息。

您可能在两个名为session_validity_token自定义项之间发生名称空间冲突。 这不是自然的Devise模型(而不是在源devise -我检查了)。

如果是这种情况,并且您可以控制源,请考虑更改一个或两个session_validity_token符号的名称,以阐明特定用法并缓解冲突。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM