如何注销使用自定义设计策略登录的用户

Posted

技术标签:

【中文标题】如何注销使用自定义设计策略登录的用户【英文标题】:How to logout user logged in with custom devise strategy 【发布时间】:2019-10-22 13:22:51 【问题描述】:

我需要注销已使用自定义 Devise 身份验证策略登录到我的 Rails 应用程序的用户。除了 database_authenticable 策略之外,还使用此策略。有没有我需要添加到我的自定义用户实现的逻辑!自定义策略中的方法?我还需要在自定义会话控制器中实现销毁方法吗?

目前我的自定义策略可以很好地登录用户(目前是硬编码),但我无法注销用户,因为注销操作调用了我的自定义实现 authenticate_user!再次,他们再次登录。

【问题讨论】:

【参考方案1】:

在这种情况下,您可以使用 skip_before_action 回调,就像在控制器中在所有操作之前放置以下代码一样

 skip_before_action :authenticate_user, only: [:your_logout_action]

这将跳过您的方法的身份验证,并且用户不会再次登录。

【讨论】:

【参考方案2】:

据我理解正确的是,让logoutcurrent_user 采取任何行动。如果是这样,那么可以这样实现

比方说,

class SomeController < ApplicationController
  before_action :authenticate_user!

  def some_action
    if some_logic == true #implement some_logic to return boolean(true/false)
      sign_out resource
      flash[:notice] = ''
      flash[:error] = 'You are logged out!'
      root_path
    end
  end
end

【讨论】:

我不认为这一切都是必需的,只是因为我已经实施了自定义策略。如果用户正确注销(这确实是我的问题),如果他们被重定向到需要身份验证的页面(在这种情况下为主页),他们应该被带到登录页面。在这种情况下,我什至需要自定义会话控制器吗?【参考方案3】:

我能够解决我的问题。问题是我一直硬编码valid? 方法以返回true。当我添加逻辑以仅在存在电子邮件和密码参数时返回 true 时,自定义身份验证按预期工作。

【讨论】:

【参考方案4】:

手动让用户退出。

sign_out(current_user) if current_user.present?

【讨论】:

以上是关于如何注销使用自定义设计策略登录的用户的主要内容,如果未能解决你的问题,请参考以下文章

如何自定义 Grails Spring Security Core 2 登录/注销控制器和视图?

Spring Security 自定义注销空指针异常

在会话自动销毁之前调用自定义方法

本地组策略

Azure AD B2C密码更改自定义策略,用户每次都需要登录

使用 FBLoginView 自定义注销