0

セッションでユーザーにサインインしようとしています。私のコントローラーには、「create」セッションというメソッドがあります。

def create
    user = User.authenticate(params[:session][:email], params[:session][:password])

    if user.nil?
        #create an error message and re-render the signin form
        flash.now[:error] = "Invalid email/password combination"
        @title = "Sign in"
        render 'new'
    else
        #sign in user and redirect to the user's show page
        sign_in user
        redirect_to user
    end
end

クラスメソッド'authenticate'は常にnullを返します。コンソールを使用して、「nil?」のユーザーを作成します。falseを返し、次に「authenticate」を呼び出すと、毎回nilが返されます。理由はわかりませんが、何時間もそれを熟考してきました。最初は、パラメータを認証メソッドに渡す方法だと思っていましたが、正しいはずです。authメソッドは通常の値のコンソールでも機能しないため、おそらくパラメータではなく、'authenticateの構造です。 '。'authenticate'メソッドとそのヘルパーメソッドは次のとおりです。

#defining a class method for "User" to authenticate a user who submits an email and password
def User.authenticate(email, submitted_password)
 user = find_by_email(email)
 return nil  if user.nil?
 return user if user.has_password?(submitted_password)
end 

# Return true if the user's password matches the submitted password.
def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
end

def self.authenticate_with_salt(id, cookie_salt)
    user =find_by_id(id)
    (user && user.salt == cookie_salt) ? user : nil
end

private
    def encrypt_password
        self.salt = make_salt if new_record?
        self.encrypted_password = encrypt(password)
    end

    def encrypt(string)
        secure_hash("#{salt}--#{string}")
    end

    def make_salt
        secure_hash("{#Time.now.utc}--#{password}")
    end

    def secure_hash(string)
        Digest::SHA2.hexdigest(string)
    end

誰もが取引が何であるか知っていますか?そして、私はもう情報を提供させていただきます。考えられる解決策を探しましたが、見つかりませんでした。

sign_in(user)メソッドとヘルパーメソッドのもの:

module SessionsHelper

def sign_in(user)
    #set cookie permanently
    cookies.permanent.signed[:remember_token] = [user.id, user.salt]
    #define "current_user" so it can be used all over the place
    self.current_user = user
end

def current_user=(user)
    @current_user = user
end

def current_user
    @current_user ||= user_from_remember_token
end

def signed_in?
    !current_user.nil?
end

def sign_out
    cookies.delete(:remember_token)
    @current_user = nil
end

private

    def user_from_remember_token
        User.authenticate_with_salt(*remember_token)
    end

    def remember_token
        cookies.signed[:remember_token] || [nil, nil]
    end
end

users_controller:

class UsersController < ApplicationController
# GET requests are automatically handled by the "show" action.
def show
    @user = User.find(params[:id])
    @title = @user.name
end

def new
    @user = User.new
    @title = "Sign up"
end

def create
    @user = User.new(params[:user])
    if @user.save
        sign_in @user
        flash[:success] = "Welcome to the Sample App!"
        redirect_to @user
    else
        @title = "Sign up"
        render 'new'
    end
end
end
4

1 に答える 1

0

少なくとも2つの問題があります。

:email1)と:passwordを検索しないでください:session。それらは、内部:paramsのハッシュではなく、ハッシュに含まれている必要があります。正しいを取得していないため、レコードが見つからないため、常にnilを返します。:session:params:emailUserUser.authenticate

2)メールが見つからない場合User.authenticateは返送されます。nil電子メールが見つかった場合は、の値を返しますsubmitted_password == encrypted_password。可能な戻り値は3つ(nil、true、false)ですが、制御パスは2つだけです。1つはnil(レコードが見つかりません)用で、もう1つは他のすべての場合用です。したがって、パスワードテストの結果に関係なくユーザーをログインします。

于 2011-06-21T05:45:33.330 に答える