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