Улучшенная (общая) реализация аутентификации

В настоящее время у меня есть метод в моем BaseController, и в каждом методе контроллера, который мне нужен для аутентификации пользователя, я всегда вызываю этот фрагмент кода:

user, err := c.getUser()
if err != nil {
        return c.Redirect(UserController.Login)
}

Который просто проверяет, если

revel.InterceptMethod((*UserController).CheckUser, revel.BEFORE)

(в init.go) добавил действительного пользователя в .RenderArgs["user"].

Могу ли я в любом случае поставить это перенаправление на страницу входа, вкл. проверка авторизации в методе фильтрации/перехвата, поэтому мне не нужно повторять приведенный выше код 10 раз? (Я разработал этот код для Revel v0.9~0.10)

Одним из решений, которое я придумал, было бы написание модуля/приложения, похожего на новый модуль csrf.

EDIT 4.11.2015: Этот вопрос был опубликован некоторое время назад, проверьте официальную документацию Revel как revel претерпел некоторое развитие


person Julius F    schedule 04.11.2014    source источник


Ответы (1)


Просто не позволяйте запросам к вашим контроллерам, если аутентификация не была выполнена должным образом. Для этого вам необходимо реализовать фильтр. Это означает что-то вроде

init.go:

revel.Filters = []revel.Filter{
    SessionFilter, // Preferably a safe implementation that isn't plaintext cookies etc
    mypackage.Authenticator
}

mypackage.go:

package mypackage

func Authenticator(c *revel.Controller, fc []revel.Filter) {
 // If authentication found (from session), pass to next Filter in stack
 // If not, redirect to your authentication UI, and pass
 // Or handle other parts of authentication requests...
 // If authentication succeeded, save it to session

 // Otherwise just drop the request (probably log?)
}

Специфика полностью зависит от того, какую аутентификацию вы настраиваете. Вот одна реализация SSO для справки.

person user918176    schedule 28.11.2014