0

我正在尝试使用会话登录用户。我的控制器有一个方法“创建”会话:

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。我不知道为什么,已经研究了好几个小时。起初我认为这是我将参数传递给 authenticate 方法的方式,但那些应该是正确的,并且由于 auth 方法甚至不能在控制台中使用常规值,所以它可能不是参数而是 '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

用户控制器:

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

我看到至少两个问题。

1 )不要:email:password. :session它们应该在:params散列中,而不是在:session散列里面:params。由于你没有得到正确的:email,你永远找不到User记录,所以User.authenticate总是返回 nil。

2)如果未找到电子邮件,User.authenticate将返回。nil如果找到电子邮件,则返回 的值submitted_password == encrypted_password。您有三个可能的返回值(nil、true、false),但只有两个控制路径,一个用于 nil(未找到记录),一个用于所有其他情况,因此无论密码测试结果如何,您都可以登录用户。

于 2011-06-21T05:45:33.330 回答