无法在View中检索会话值

时间:2014-10-29 10:52:42

标签: ruby session ruby-on-rails-4

我无法获取我在控制器级别存储的会话值。代码如下:

登录档案

<div class="login">
  <h1>Login to HITS</h1>
  <div><%= flash[:notice] %></div>
  <div><%= session[:userinfo] %></div>
  <form method="post" action="isloggedin">
    <p><input id="login" type="text" name="login" value="" placeholder="Username or Email"></p>
    <p><input id="password" type="password" name="password" value="" placeholder="Password"></p>
    <p class="submit"><input type="submit" name="commit" value="Login"></p>
  </form>
</div>

控制器文件

class UserController < ApplicationController
  protect_from_forgery
    def isloggedin
        login = params[:login].to_s
        password = params[:password].to_s
        logged_in = User.where(:user_name => login,:password => password).limit(1)
        if not logged_in.blank?
          #session[:userinfo] = logged_in
          session[:userinfo] = 'Name'
          puts(session[:userinfo])
          redirect_to '/event/list'
        else
          #render :json => { :status => :fail}
          #flash[:error] = 'Unable to login'
          redirect_to '/user/login',:flash => { :error => "Insufficient rights!" }
        end

      end
end

在视图和控制器中,我做了以下操作:

@picture = session[:userinfo] #at Controller Level
<%= @picture %>

它打印无。

我在Rails4上 session.store.rb

Rails.application.config.session_store :cookie_store, key: '_APP_session'

我可以看到正在创建会话cookie。

更新:控制台提供以下消息:

Processing by UserController#isloggedin as HTML
  Parameters: {"login"=>"Jhon", "password"=>"[FILTERED]", "commit"=>"Login"}
Can't verify CSRF token authenticity

更新#2

在我的登录表单中,我看不到下面给出的内容。如何手动添加它?

<div style="display:none"><input name="utf8" type="hidden" value="&#x2713;" /><input name="authenticity_token" type="hidden" value="a4y1SDHaXHRkiyIW8AncOYcPgRiO5syFXihKc5qqZlg=" /></div>

2 个答案:

答案 0 :(得分:1)

由于您在日志中收到“无法验证CSRF令牌”的警告,因此可能会在每次请求时重置会话

添加到您的布局(application_layout head标签):

<%= csrf_meta_tags %>

应该清除警告并解决会话问题!

答案 1 :(得分:0)

logged_in = User.where(:user_name => login,:password => password).limit(1)
if not logged_in.blank?

if语句总是假的。 logged_inActiveRecord::Relation对象,永远不会为空。将其更改为:

if User.find_by(user_name: login, password: password)

其他位:

永远不会永远存储普通密码到数据库中!这是一个严重的安全漏洞 - 想象一下你的数据库备份进入了黑客手中。使用散列密码,黑客获取了所有数据,但无法以其他用户身份登录。使用has_secure_password功能处理密码哈希。

问题编辑后:

不要手工制作你的观点,使用表格助手 - 它们会让你的生活更轻松:

<div class="login">
  <h1>Login to HITS</h1>
  <div><%= flash[:notice] %></div>
  <div><%= session[:userinfo] %></div>
  <%= form_tag action: 'isloggedin' do %>
    <p><%= text_field_tag :login, nil, placeholder: 'Username or Email'></p>
    <p><%= password_field_tag :password, nil, placeholder: 'Password'%></p>
    <p class="submit"><%= submit_tag :commit, 'Login'></p>
  <% end %>
</div>

form_tagform_for会自动将CRSF隐藏字段添加到表单中。