基本ruby on rails认证麻烦

时间:2012-04-23 21:37:55

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

我正在为rails应用程序开发基本身份验证系统。身份验证使用net-ldap类从Active Directory验证帐户信息(此部分工作正常)。

然而,我的session_helper似乎有些问题。即使ActiveDirectoryUser.authenticate成功,signed_in帮助程序也始终返回false。登录后,脚本重定向到root_path(default_controller的主页),然后立即重定向回到signin_path--由于signed_in帮助器返回false。

请参阅下面的代码。我错过了什么?

由于

application_controller.rb

class ApplicationController < ActionController::Base
  protect_from_forgery
  include SessionsHelper
end

default_controller.rb

class DefaultController < ApplicationController
  before_filter :signed_in_user

  def home
  end

  private
    def signed_in_user
      redirect_to signin_path, notice: "Please sign in." unless signed_in?
    end
end

sessions_helper.rb

module SessionsHelper
  def sign_in(user)
    @current_user = user
  end

  def current_user
    @current_user ||= nil
  end

  def signed_in?
    !@current_user.nil?
  end

  def sign_out
    @current_user = nil
  end
end

sessions_controller.rb

class SessionsController < ApplicationController
  def new
  end

  def create    
    user = ActiveDirectoryUser.authenticate(params[:session][:username],params[:session][:password])

    if user.nil?
      # authentication failed
      flash.now[:error] = 'Invalid email/password combination'
      render 'new'
    else
      # authentication succeeded
      sign_in @user
      flash[:error] = 'Great success'
      redirect_to root_path
    end
  end

  def destroy
    sign_out
    redirect_to root_path
  end
end

1 个答案:

答案 0 :(得分:0)

你应该使用session来保存那种数据(对于每个请求都是可评估的),它是用户数据。但我强烈建议您使用像设计这样的宝石,它可以为您完成所有认证工作。为什么要重新发明呢?

我相信这对你有用。

module SessionsHelper
  def sign_in(user)
    session[:user_id] = user.id
  end

  def current_user
    ActiveDirectoryUser.find(session[:user_id]) ||= nil
  end

  def signed_in?
    !session[:user_id].nil?
  end

  def sign_out
    session[:user_id] = nil
  end
end