0

我对 Rails 比较陌生,现在我正在开发一个简单的登录注销系统。

在我的应用程序中,当我登录时生成的 URL 是:

本地主机:3000/用户/索引/7

当我注销时,我回到了根目录。但是,如果复制此 URL 并将其粘贴到另一个浏览器窗口中,我会立即登录,而不会被定向到登录表单。如何纠正这个问题。

我试图将用户 ID 存储在会话哈希中,然后在注销时我将会话中的用户 ID 设置为 nil。但这不起作用。需要帮助。

编辑:

在我的家庭控制器中

class HomeController < ApplicationController
   def signin
     user=User.find(:all,:conditions=>["user_login=? AND user_password=?",params[:user]     [:username],params[:user][:password]);

   if user!=nil
        session[:user_id]=user.user_id;
        redirect_to({:controller=>'user'})
   end

   end
end

在用户控制器中,我有一个注销方法:

def logout
   session[:user_id]=nil;
   redirect_to({:controller=>'home'});
end

我的 routes.rb 文件如下所示:

ActionController::Routing::Routes.draw do |map|

  map.root :controller => "home",:action => "index"
  map.connect ':controller/:action/:id'
  map.connect ':controller/:action/:id.:format'
end

编辑:

我已经解决了这个问题,我没有在用户控制器索引方法中检查会话哈希中的 id 值。但我有另一个问题如果我在 rails 2.3.17 中有一个应用程序并且我想将它转移到最新版本我需要做多少改变

4

4 回答 4

2

您可以在控制器中为这些操作设置 before_filter。使用 before_filter 你可以检查 session 是否为 nil 或 value 是否存在。

否则,您可以关注此 railscasts 视频

http://railscasts.com/episodes/250-authentication-from-scratch

于 2013-05-03T11:13:11.653 回答
0

我真的建议使用现有的身份验证系统,例如https://github.com/plataformatec/devise

在这个站点上,您可以轻松地获得有关其他现有系统的概述,以及那里的流行度和开发活动。 https://www.ruby-toolbox.com/categories/rails_authentication

你真的不必自己编写这些东西,但如果你真的喜欢这样做,也许这也可以帮助你:http ://railscasts.com/episodes/250-authentication-from-scratch-revised 。但我绝对推荐设计。

于 2013-05-03T12:53:37.073 回答
0

我认为您正在尝试在这里重新发明轮子。您可以has_secure_password在 User 模型中使用并生成一个sessions_controller来处理创建和销毁。方法基本相同,但带有has_secure_password标志。然后,您应该注意正确地销毁会话。

于 2013-05-03T12:18:02.460 回答
0

这是基本身份验证的默认行为。登录后,您的所有凭据都存储在由浏览器维护的会话标头中。如果您清除缓存,那么它应该再次提示输入密码......

于 2013-05-03T11:15:54.767 回答