2

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
4

1 に答える 1

0

その種のデータを永続化するには、セッションを使用する必要があります (リクエストごとに評価可能になります)。これはユーザー データです。ただし、すべての認証などを行うdevise gem のようなものを使用することを強くお勧めします。なぜ再発明するのですか?

私はこれがあなたのために働くと信じています.

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
于 2012-04-23T22:20:06.870 に答える