在 RESTFUL 身份验证中添加注销按钮

Posted

技术标签:

【中文标题】在 RESTFUL 身份验证中添加注销按钮【英文标题】:Add a logout button in RESTFUL authentication 【发布时间】:2011-01-11 02:50:46 【问题描述】:

我已经安装了 RESTFUL 身份验证,一切似乎都运行良好。我可以注册和登录。我可以注销的唯一方法是输入 URL http://localhost:3000/logout

如何在页面上添加注销按钮?我尝试在 members.rhtml 中添加一个

<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>

引用 session_controller.rb 但我收到一个错误“没有对显示做出响应的操作。操作:创建、销毁和新建”

有什么想法吗?谢谢

【问题讨论】:

【参考方案1】:

你的路由文件中有什么?

试试看

map.log_out 'logout', :controller => 'sessions', :action => 'destroy'

在你的路线中。

然后就可以了

<%= link_to "Sign out", log_out_url %>

退出链接。

编辑

这完全取决于您如何指定路由。

因为您在路由中有 map.log_out,所以 url http://localhost:3000/logout url 会被它拾取并路由到正确的操作。

如果你有:

<%= link_to "logout", :controller=> "sessions", :action=> "destroy" %>

这只会为您生成http://localhost:3000/session 的链接。但是,它对路由没有任何作用。您仍然需要指定正确的路线。

请注意,Rails 不会将销毁操作附加到 url。 (它不会创建http://localhost:3000/session/destroy。) 它假设如果你有一个破坏动作,你将使用 DELETE http 动词发送它。由于某种原因,它不是很完美,实际上也没有默认发送 DELETE 动词。

你可以强制它这样做:

<%= link_to "logout", :controller=> "user_sessions", :action=> "destroy", :method => :delete%>

除非您也正确路由它,否则这仍然不起作用。如果您将以下内容放入路线中:

map.resource :session

然后 rails 将为所有动词生成路由并为它们指定默认操作,包括 DELETE。更多信息可以在这里找到:Rails Routing from the Outside In。

整个页面值得一遍又一遍地阅读,直到您真正理解为止。路由是理解 Rails 的关键!

对于像 Sessions 这样的简单控制器,只需指定 log_out 路由,然后链接到 log_out_url..

(希望这是有道理的,睡眠剥夺正在蔓延!)

【讨论】:

我的 routes.rb 有 map.logout '/logout', :controller => 'sessions', :action => 'destroy' 太棒了......这工作!我用 谢谢 只是出于好奇...不应该 "sessions", :action=> "destroy" %> 工作吗?它引用了 session_controller 中的 'destroy' def,它执行了 'logout'【参考方案2】:

如果您正在使用 devise 并且您关注的模型是 User,那么优雅的方法就在这里:

<%= link_to 'logout', destroy_user_session_path, method: :delete %>

之所以有效,是因为:

由于HTTP方法有GET、POST、PUT、PATCH和DELETE,所以使用method: :delete(不是method: :destroy) 我们像往常一样将destroy_user_session_pathdeviseUser 模型一起使用,如果您定义其他模型名称,例如 Manager,您只需将注销路径更改为destroy_manager_session_path

【讨论】:

以上是关于在 RESTFUL 身份验证中添加注销按钮的主要内容,如果未能解决你的问题,请参考以下文章

如何在 asp.net 应用程序中注销按钮 Windows 身份验证

使用浏览器后退按钮进行 ASP.NET 身份验证登录和注销

使用 Restful 身份验证的无意会话劫持问题

为啥基于表单的身份验证不被视为 RESTful?

外部身份验证提供程序和对 RESTful API 的请求的身份验证

Devise 的 HTTP 身份验证中断了常规注销