2009-12-27 7 views
0

쿼리 언어를 사용하여 원하는 레코드를 찾을 수 있다는 것을 알고 있습니다. 내가 로그인 페이지를하고 있는데, 사용자 이름과 암호와 일치하는 레코드를 찾고 싶지만 원하는 모든 사용자를 찾기 위해 모든 요소를 ​​반복하고 싶지 않습니다. (< % @ users.each do | user | %>), SQL을 입력하는 것을 제외하고는 RoR에서 수행해야합니다.RoR에서 레코드를 검색하는 방법은 무엇입니까?

답변

3

아마도 : 다른 동안

@user = User.find_by_user_name_and_password('scott', 'tiger') 
+0

나 같은 초심자에게는 authlogic을 사용하는 것이 어려워 보입니다 ... ... RoR이 많은 짧은 손길을 가지고 있지만 그걸 충분히 이해하지 못하는 것 같습니다. – DNB5brims

3

당신은 _ 이름과 암호로 사용자를 찾을 동적 파인더를 사용할 수 있습니다 것이 좋습니다 샘 (Sam)과 찬드라 (Chandra)가 제공 한 답변은 기술적으로 정확합니다. 두 솔루션 모두 암호가 일반 텍스트로 저장된다는 것을 의미합니다. a 매우 나쁜 아이디어. 데이터베이스에 액세스해서는 안되는 누군가가 있으면 모든 비밀번호와 결합 된 완전한 사용자 이름 (잠재적으로 이메일 주소)을 갖게됩니다.

대신 알고리즘을 사용하여 암호가 데이터베이스에서 암호화되었는지 확인하십시오 (예 : bcrypt). 사용하려면 bcrypt-rub 보석이 필요합니다.

또한 쿼리의 암호를 모두 사용하지 않는 것이 좋습니다. 이는 추가적인 보안 수준을 제공하기 때문에 좋은 관행입니다. SQL 인젝션은 수행하기가 더 어려워집니다. 당신이해야 모두 사용 bcrypt, 이상적으로

@user = User.find_by_username(params[:username]) 
if @user.password == params[:password] 
    # do something 
else 
    # do something else 
end 

및 쿼리에서 암호를 생략 : 사용자 고유의 사용자 이름이있는 경우, 그냥 이름을 가져 오는 것은 암호가 올바른지 여부를 확인 할 수있는 후 동일한 개체를 반환해야합니다. 이렇게하는 방법은 GitHub의 bcrypt-ruby readme (내가 제공 한 링크)에 설명되어 있습니다.

0

:

User.first(:conditions => {:login => 'ted', :password => 'secret'}) 
# returns nil for no match and first match for a good record 
# make sure there is a unique index on login 

인증을 위해 나는 강하게 authlogic (railscast)

관련 문제