리팩터링을 시도할 때 'Has_secure_password'를 어떻게 사용합니까?
-
13-11-2019 - |
문제
Railstutorial 인증 메커니즘을 리팩터링하려고 합니다.
내 Rails 버전은 3.2.0이고 Ruby 1.9.3-p0 및 postrgresql 9.1을 사용하고 있습니다.
지금까지 로그인 시도가 실패했지만 로그인에 성공하면 테스트가 통과되었습니다.(이유는 이전 로그인 메커니즘을 리팩터링해야 하기 때문입니다)
내 세션 도우미 sign_in 함수는 다음과 같습니다.
def sign_in(employee)
cookies.permanent.signed[:remember_token] = [employee.id, employee.salt]
self.current_employee = employee
end.
sign_in 함수에서 즉시 확인되는 한 가지 문제는 has_secure_password가 이미 암호화 및 솔트 등을 처리한다는 것입니다.내 생각은 아마도 Employee.salt 대신에 Password_digest를 사용해야 한다는 것이었지만 그것도 실패했습니다.
내 쿠키가 2시간 후에 만료되도록 하고 싶습니다.api.rubyonrails.org의 쿠키 아래에서 이 옵션을 찾았습니다.
cookies[:key] = {
value => "employee.id, employee.salt",
expires => 2.hours.from.now
}
제가 가지고 있는 또 다른 질문은 has_secure_password에 이미 인증 방법이 있다는 사실과 관련이 있습니다. 즉, Rails 튜토리얼의 직원 모델(사용자 모델)에 정의된 인증 정의를 사용할 필요가 없다는 뜻입니다. 하지만 주석을 달 때 밖으로 나가면 다음과 같은 깃발이 보입니다.
NoMethodError: undefined method 'authenticate'
내 세션 컨트롤러 생성 작업은 다음과 같습니다.
def create
employee = Employee.authenticate(params[:session][:email],
params[:session][:password])
if employee.nil?
flash.now[:error] = "Invalid email/password combination."
@title = "Sign in"
render 'new'
else
sign_in employee
redirect_back_or employee
end
end
Employee.authenticate가 문제인 것 같습니다.
그래서 본질적으로 세 가지 질문이 있으며 그 질문은 다음과 같습니다.
Rails 튜토리얼에서는 직원 비밀번호에 솔트 등을 암호화하고 적용하는 상당히 긴 프로세스를 진행합니다.has_secure_password가 이미 처리했으므로 암호화된 비밀번호를 캡처하는 함수나 인수에 어떤 변수를 전달해야 합니까?
다음 질문은 쿠키 만료와 관련이 있으며, sign_in 함수에서 이를 어떻게 사용합니까?
마지막으로, 레일즈가 진짜 방법으로 인식할 수 있도록 인증 방법을 어떻게 사용하나요?
기록을 위해 Railsguide, api.rubyonrails.org 및 SO에 대한 이와 유사한 기타 질문을 검색했습니다.물론 이것은 제가 원리에 대한 이해가 부족하다는 점을 지적하는 것일 뿐이지만, 저는 배우고 있고 방향을 잘 잡고 있습니다.
저와 공유해 주실 수 있는 생각, 제안, 자료에 감사드립니다.
업데이트has_secure_password에서 API를 다시 읽고 인증은 암호화되지 않은 비밀번호라는 하나의 인수만 사용합니다.그래서 제가 할 일이 있어요.
나는 아직도 당신이 제공할 수 있는 도움이나 생각, 제안이 필요합니다.감사해요.
업데이트세션 시간 초과를 다루는 다음 기사를 찾았습니다.http://madkingsmusings.blogspot.com/2011/05/session-timeouts-on-rails.html나는 여전히 그것이 나를 위해 작동하도록 할 수 있는지 알아보기 위해 노력하고 있지만 이는 Railstutorial에 맞게 조정되었습니다.다른 질문에 대해서는 Michael Hartl이 Ruby on Rails 튜토리얼의 두 번째 버전을 작성하느라 바쁘고 해당 버전에서는 has_secure_password를 다룰 예정입니다.
해결책
RailStutorial의 새 버전을 사용할 수 있습니다.
첫 번째와 마지막 질문 질문에 대해 ... 인증을 매우 간단하게 찾을 수 있습니다. 사용자 모델 :
has_secure_password
.
SessionController :
def create
user = User.find_by_email(params[:session][:email])
if user && user.authenticate(params[:session][:password])
sign_in user
redirect_back_or user
else
flash.now[:error] = 'Invalid email/password combination'
render 'new'
end
end
.
Sessionshelper :
def sign_in(user)
cookies[:remember_token] = user.remember_token
current_user = user
end
.
그것은 분명해야했지만 github에서 코드를 찾는 것에 대해서도 생각도하지 않았습니다.어쩌면 다른 누군가가 링크를 알게 될 것입니다. github의 Hartl의 2 번째 버전 sample_app 소스