В книге Майкла Харта этот код используется для реализации аутентификации:
module SessionsHelper
def sign_in(user)
cookies.permanent.signed[:remember_token] = [user.id, user.salt] #permanent
# -alternatively-
# cookies.signed[:remember_token]={
# :value => [user.id, user.salt],
# expires => some_time.from_now
# }
current_user = user
end
def current_user=(user)
@current_user = user
end
def current_user
return @current_user ||= user_from_remember_token
end
private
def user_from_remember_token
#passes array of length two as a parameter -- first slot contains ID,
#second contains SALT for encryption
User.authenticate_with_salt(*remember_token)
end
def remember_token
#ensures return of a double array in the event that
#cookies.signed[:remember_token] is nil.
cookies.signed[:remember_token] || [nil,nil]
end
end
Он отлично справляется со своей работой, я могу либо войти в систему на бесконечное количество времени, либо на ограниченный период времени, как я хочу.
Но у него есть и обратная сторона: куки хранятся на клиенте, и они не исчезают, даже если браузер закрыт
Теперь мне было интересно, так как сеансы rails разрушаются после закрытия браузера, как бы я объединил их и файлы cookie, представленные здесь, для реализации аутентификации со следующими характеристиками:
- если пользователь входит в систему,
данные должны храниться в сеансе
так что после того, как пользователь закрывает свой браузер, он получает логин
- если пользователь входит в систему, с установленным флажком «запомнить меня»
их данные должны храниться в cookie-файлах с длительным сроком годности
Что можно предпринять, чтобы оставаться безопасным и простым?
Я гуглил в Интернете и не нашел ничего достаточно недавнего (Rails 3), что
может направить меня в правильном направлении.
Я думал о создании 2 отдельных модулей для сессий и файлов cookie и запуска их соответствующих методов sign_in в контроллере, независимо от того, присутствует ли параметр Remember_me или нет, но это может показаться большим дублированием.
PS Я не изучаю какие-либо гемы аутентификации для обеспечения этой функциональности, я предпочитаю реализовывать их самостоятельно.
Спасибо