1

新しいアプリケーションでユーザー認証プロセスを再作成しようとしています。私は機能する古い既存のユーザー認証を持っており、それが良い出発点になることを期待して、文字通りコードをコピーしました(もちろん名前を変更しました)...しかし、機能しません! いろいろ試してみたのですが、なぜかこのプログラムにログインできません… 何か見落としがあるのでしょうか?

login.html.erb

<div class="login" style="margin-left: 390px;">
  <%= form_tag(:action => 'team_login') do %>
  <table>
    <tr>
      <td><%= label_tag(:username) %></td>
      <td><%= text_field_tag(:username) %></td>
    </tr>
    <tr>
      <td><%= label_tag(:password) %></td>
      <td><%= password_field_tag(:password) %></td>
    </tr>
    <tr>
      <td>&nbsp;</td>
      <td><%= submit_tag("Log In") %></td>
    </tr>
  </table>
  <% end %>
</div>

team_controller.rb

  def team_login
    authorized_team = Team.authenticate(params[:username], params[:password])
    if authorized_team
      #To Do: mark user as logged in
      session[:team_id] = authorized_team.id
      session[:team_name] = authorized_team.username
      #check!
      flash[:notice] = "You are now logged in."
      redirect_to(:controller => 'show', :id => session[:team_id])
    else
      flash[:notice] = "Invalid username and password combination"
      redirect_to(:action => 'login')
    end
  end

team.rb

  attr_accessible :username, :password

  attr_accessor :password

  before_save :create_hashed_password

  def self.authenticate(username="", password="")
    qTeam = Team.find_by_username(username)
    if qTeam && qTeam.password_match?(password)
      return qTeam
    else
      return false
    end
  end

  def password_match?(password="")
    hashed == Team.salt_hash(salt, password)
  end

  def self.make_salt(username="")
    Digest::SHA1.hexdigest(" #{username} #{Time.now}")
  end

  def self.salt_hash(salt="", password="")
    Digest::SHA1.hexdigest("#{salt} #{password}")
  end

  private

  def create_hashed_password
    unless password.blank?
      self.salt = Team.make_salt(username) if salt.blank?
      self.hashed = Team.salt_hash(password, salt)
    end
  end

ユーザーの作成時にエラーが発生していることに気付きました。手動で入力して、ユーザーに保存されたソルトとパスワードを使用し、ハッシュ化されたパスワードを生成すると、データベースに保存されているものとは異なります。ここでエラーが発生していると思います。ユーザーを作成するために使用しているテンプレートは、足場から生成された標準の _form です。すべてのコードは上記と同じです - before_save はいくつかのメソッド (create_hashed_pa​​ssword、make_salt、salt_hash) を介して実行されます。

4

1 に答える 1

0

次のことを確認する必要があります。

:action => 'team_login'

動作するルートを指しています。

私は通常次のようなものを使用します:

<%= form_tag sessions_path do %>
...
<% end %>

次のように表示されるルートを使用します。

MyApp::Application.routes.draw do
  get "sessions/new"
  get "login" => "sessions#new", :as => "login"
  resources :sessions
  ...
end

次のようなsessions_controllerを使用します。

class SessionsController < ApplicationController

  def create
    user = login(params[:email], params[:password], params[:remember_me])
    if user
      redirect_back_or_to root_url, :notice => "Welcome, #{user.email}."
    else
      flash.now.alert = "Email or password was invalid"
      render :new
    end
  end

  def destroy
    logout
    redirect_to root_url, :notice => "Logged out!"
  end
end

あるアプリから別のアプリに認証などの機能をコピー/貼り付けする場合、ルーティングの配線を忘れることはよくある事故です。

于 2013-01-30T23:18:54.753 に答える