繁体   English   中英

Ruby on Rails Devise 代码登录后

[英]Ruby on Rails Devise code after login

我有一个使用 Devise 进行登录的 RoR 应用程序。 有一些代码在创建新的用户记录时被执行,通过作为 after_create 调用/宏/whatever 放在 user.rb 文件中。 我需要在每次登录后运行此代码,而不是在创建新用户时运行。

通过一些谷歌搜索,似乎一种选择是将 Warden 回调放在 devise.rb 代码中。 我的问题是:

  1. 这是正确的,和/或有更好的方法吗?
  2. 如果这是正确的方法...
    • Warden::Manager... 方法应该在 Devise.setup 内部的 devise.rb 中或之后定义 go 吗?
    • after_authentication 是我应该使用的回调吗? 我只是检查是否存在基于用户名的目录,如果不存在,则创建它。

只需继承 Devise 的会话控制器并将您的自定义行为放在那里:

# config/routes.rb
devise_for :users, :controllers => { :sessions => "custom_sessions" }

然后像这样创建你的控制器:

# app/controllers/custom_sessions_controller.rb
class CustomSessionsController < Devise::SessionsController
  ## for rails 5+, use before_action, after_action
  before_filter :before_login, :only => :create
  after_filter :after_login, :only => :create

  def before_login
  end

  def after_login
  end
end

我发现在登录事件捕获后通过查找“:set_user”:event 完全允许使用 Devise Warden 钩子。

在 user.rb 中:

class User < ApplicationRecord
  Warden::Manager.after_set_user do |user, auth, opts|
    if (opts[:scope] == :user && opts[:event] == :set_user)
      # < Do your after login work here >
    end
  end
end

我认为这是一个重复的问题。 是的,您可以在每次成功登录后执行代码。您可以在 ApplicationController 中编写代码。 也看看http://github.com/plataformatec/devise/wiki/How-To:-Redirect-to-a-specific-page-on-successful-sign-in 另外,请查看如何在使用 rails devise gem 成功注册后重定向到特定页面? 对于一些想法。

您可以执行以下操作:

def after_sign_in_path_for(resource_or_scope)
Your Code Here
end

参考我可以在使用 Devise 成功登录后执行自定义操作吗?

您还可以从设计会话的类继承并使用 after_filter 进行登录。

2022 年更新

Warden 现在有内置回调,用于在 after_authentication 上执行您自己的代码:

Warden::Manager.after_authentication do |user, _auth, _opts| 
  TelegramService.send("#{account.name} just logged in") 
end

资料来源: https://github.com/wardencommunity/warden/wiki/Callbacks#after_authentication

暂无
暂无

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

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