Yesod auth: пренасочване на потребителя към страницата за регистрация

Играя със скелетен сайт и искам да изпратя потребителя на страницата за регистрация, след като е влязъл за първи път с OpenID или акаунт в Google.

Измислих това:

getAuthId creds = runDB $ do
        x ←  getBy $ UniqueUser $ credsIdent creds
        case x of
            Just (Entity uid _) → return $ Just uid
            Nothing → do
                return $ Just $ Key (PersistInt64 0)

И в HomeR манипулатора проверявам за стойност на UserId, показвайки регистрационен формуляр в случай на нула.

Този подход работи, но изглежда хакерски. Какъв е правилният начин за справяне с подобен проблем?


person arrowd    schedule 01.08.2012    source източник
comment
Защо не върнете нищо вместо фиктивен ключ?   -  person nomen    schedule 10.06.2014


Отговори (1)


Бих препоръчал разделянето на информацията на два обекта: User обект, който проследява идентификационните данни на потребителя, и Profile обект, съдържащ информацията за регистрация. Например:

User
    ident Text
    UniqueUser ident
Profile
    user UserId
    displayName Text
    UniqueProfile user

В getAuthId или ще върнете съществуващ UserId, или ако такъв не съществува, ще създадете нов запис. В HomeR ще получите дали има Profile (getBy $ UniqueProfile uid), а ако не, ще покажете регистрационния формуляр.

person Michael Snoyman    schedule 01.08.2012
comment
Хм, но ако потребителят реши да не се регистрира, ще се окажа с висящ запис. Напротив, не е голяма работа, нали? - person arrowd; 02.08.2012
comment
Не бих се тревожил за това. Всичко, което таблицата User прави, е да даде някакъв идентификатор за идентичности. Това наистина е просто мярка за ефективност: можете да използвате еквивалентно просто действителния идентификатор вместо UserId, но мисля, че това е по-чисто. Ако наистина се притеснявате от висящи записи, можете да извършвате почистване от време на време, за да ги премахнете. - person Michael Snoyman; 03.08.2012