Как создать функцию входа в систему без использования Spring Security с Grails 3 с использованием перехватчиков - PullRequest
0 голосов
/ 03 мая 2019

Система имеет два приложения grails:

  1. частный бэк-офис, который использует springsecurity, и объект домена Operator, содержащий имя пользователя, пароль, количество неудачных входов в систему и т. Д.
  2. publicвеб-интерфейс, где пользователи регистрируются, входят в систему и используют систему.Объект «Домен пользователя» содержит имя пользователя, пароль и т. Д.

Поскольку мы используем springsecuirty для бэк-офиса, я предполагаю, что мы не сможем снова использовать его для Интернета (config и db будут конфликтовать).Кроме того, для веба требуется лишь базовая авторизация (для всех страниц требуется действительный сеанс, кроме регистрации и самой формы входа).

Настройка формы входа и перехватчика проста.

Вопрос в том, что на самом деле должна делать форма входа в контроллер?Я могу проверить, что имя пользователя и пароль совпадают с тем, что находится в БД, тогда мне, вероятно, нужно создать сеанс с таймаутами сеанса и т. Д. Где я могу найти документацию о том, как это сделать?http://docs.grails.org/3.1.1/ref/Servlet%20API/session.html Сообщает вам, как выйти, но не войти.Предположительно мне нужно хранить сеансы в БД (чтобы пользователь мог подключиться к любому серверу) и т. Д.

1 Ответ

0 голосов
/ 03 мая 2019

Посмотрев на мой старый код Java, я кое-что понял.

Перехватчик выглядит так:

class AuthInterceptor {
    public AuthInterceptor() {
        // allow the login form and register form to work.
        matchAll().excludes(controller: 'auth')
    }
    boolean before() {
        if(session.getAttribute("user")== null ) {
            // jump to the login form if there is no user attribute.
            redirect controller: 'auth', action: 'login'
            return false
        }
        true
    }
    boolean after() { true }
    void afterView() {
        // no-op
    }

Контроллер выглядит так:

class AuthController {
    def index() { }

    def login() {
        def email = params.email
        def password = params.password

        if (email != null) {
            // It would be better to invalidate the old session
            // but if we do, we cant get a new one...
            // session.invalidate()

            User user = User.findByEmail(email);
            if (user != null) {
                log.error("user.pass:" +  user.password +  " pass:" + password)
                // @TODO handle password encryption
                if (user.password == password) {
                    session.setAttribute("user", user)
                    redirect(controller:"dashboard")
                }
            }
            flash.message = "email or password incorrect"
        }
        render (view:"login")
    } // login()

Однако я еще не нашел, где мы можем установить время ожидания сеанса.

...