Реализация аутентификации "Rails by Example" - PullRequest
1 голос
/ 08 июля 2011

В книге Майкла Харта этот код используется для реализации аутентификации:

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 Я не изучаю какие-либо гемы аутентификации для обеспечения этой функциональности, я предпочитаю реализовывать их самостоятельно.

Спасибо

...