设计:注销后重置令牌

时间:2011-06-24 12:30:05

标签: ruby-on-rails ruby-on-rails-3 authentication devise

我正在使用单一访问令牌,我想在退出时重置它。

一种可能的方法是调用reset_authentication_token!在模型中的after_token_authentication中,但是我必须知道它是模型中的sign_out动作。

如何以更好的方式实现这一目标? 我正在使用设计1.3.4

感谢。

3 个答案:

答案 0 :(得分:0)

这是我用来添加/重置令牌的非常好的blog post

这当然只是一个简单的例子,他在视图中调用的链接是创建/销毁令牌。但是,这些相同的路径可以在控制器中使用,效果相同。

答案 1 :(得分:0)

只需在应用程序控制器中覆盖“after_sign_out_path_for”,然后在那里重置令牌。不需要编写自己的SessionController(尽管Nathan提到它非常简单)。

以下是您应该使用的方法:http://rubydoc.info/gems/devise/1.3.4/frames - (对象)after_sign_out_path_for(resource_or_scope)

会话控制器用于注销用户的方法。您可以在ApplicationController中覆盖它,以便为自定义范围提供自定义挂钩。请注意,与after_sign_in_path_for不同,此方法接收带范围的符号,而不是资源。

默认为root_path。

欢呼声

答案 2 :(得分:0)

因为我遇到了同样的问题。这就是我发现的:

Devise Wiki: simple token authentication example

Devise Wike: simple token authentication links

在我的SessionsController< Devise :: SessionsController我覆盖了destroy方法(从设计代表中获取并修改了它)

  def destroy
    token_was_removed = remove_current_users_token_if_json_request

    redirect_path = after_sign_out_path_for(resource_name)
    signed_out = (Devise.sign_out_all_scopes ? sign_out : sign_out(resource_name))
    set_flash_message :notice, :signed_out if signed_out && is_navigational_format?

    respond_with resource do |format|
      format.html { redirect_to static_pages_login_path }
      format.json {
        if token_was_removed
          render :status=>200, :json=>{:message => "Logout successful." }
        else
          render :status=>401, :json=>{:message => "Logout failed. Invalid token or some internal server error while saving." }
        end
      }
    end
  end



  def remove_current_users_token_if_json_request
    #remove the users authentication token if user is logged in
    if current_user and request.format.json?
      current_user.authentication_token = nil
      return current_user.save
    else
      return false
    end
  end