Hi all,
Saya lagi belajar buat sistem autentikasi sederhana (masih nyontek buku
si..). Saya mengalami keanehan saat saya masukkan username dan password
dengan benar, saya masih gagal melewati autentikasi itu. Ini log server-nya:
Processing UsersController#login (for 127.0.0.1 at 2008-05-23 09:41:06)
[POST]
Session ID: 36f8fd6ed5ef09c4384c100cd489e9ca
Parameters: {"user"=>{"login"=>"dida", "password"=>"123"},
"commit"=>"Login", "action"=>"login", "controller"=>"users"}
User Columns (0.001291) SHOW FIELDS FROM users
User Load (0.004381) SELECT * FROM users WHERE (*users.`login` IS NULL*)
LIMIT 1
Rendering within layouts/application
Rendering users/login
Completed in 0.04094 (24 reqs/sec) | Rendering: 0.00509 (12%) | DB: 0.00567
(13%) | 200 OK [http://localhost/login]
pertanyaan saya, kenapa query-nya "users.login IS NULL" padahal jelas2
parameter yang didapat dari method POST itu benar (sprt pd hash di atas).
Setelah penasaran, saya coba cek dengan console. Sebelumnya, mungkin ada
baiknya saya paste-kan beberapa source code di sini.
*Controller: users_controller.rb *
...
def login
if request.post?
if user = User.authenticate(params[:login], params[:password])
session[:user_id] = user.id
redirect_to :controller => 'acaras', :action => 'index'
else
flash[:notice] = 'User/password anda salah'
end
end
end
...
*Model: user.rb*
...
before_save :encrypt_new_password
def self.authenticate(login, password)
user = find_by_login(login)
return user if user && user.authenticated?(password)
end
def authenticated?(password)
hashed_password == encrypt(password)
end
protected
def encrypt_new_password
return if password.blank?
self.hashed_password = encrypt(password)
end
def password_required?
hashed_password.blank? || !password.blank?
end
def encrypt(string)
Digest::SHA1.hexdigest(string)
end
...
Saya coba dengan console menjalankan ini:
user2 = User.authenticate("dida", "123")
ActiveRecord::StatementInvalid: Mysql::Error: MySQL server has gone
away: *SELECT
* FROM users WHERE (users.`login` = 'dida')* LIMIT 1
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract_adapter.rb:128:in
`log'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:243:in
`execute'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/mysql_adapter.rb:399:in
`select'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/connection_adapters/abstract/database_statements.rb:7:in
`select_all'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:427:in
`find_by_sql'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:997:in
`find_every'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:991:in
`find_initial'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`send'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`method_missing'
from
/usr/lib/ruby/gems/1.8/gems/activesupport-1.4.2/lib/active_support/deprecation.rb:44:in
`silence'
from
/usr/lib/ruby/gems/1.8/gems/activerecord-1.15.3/lib/active_record/base.rb:1204:in
`method_missing'
from ./script/../config/../config/../app/models/user.rb:28:in
`authenticate'
from (irb):10
Query-nya benar, tapi kok ada error "MySQL server has gone away"? Padahal
servis mysql-nya jalan lho.. Saya jadi menemukan masalah lain lagi (atau
inikah masalah sebenarnya? CMIIW).
Sebagai rangkuman, pertanyaan saya adalah:
1. Mengapa query pada server params[:login] nya tidak ada? (SELECT * FROM
users WHERE (*users.`login` IS NULL*))
2. Ada apa dengan error "MySQL server has gone away"?
Masih googling untuk cari jawaban pertanyaan kedua. Kalo yang pertama,
bingung cari dengan keyword apa.
Makasih sebelumnya,
Dida
[Non-text portions of this message have been removed]