Строим блог на основе Node.js MVC фреймворка Areto

Контроллер безопасности

Пользователь блога может зарегистроваться, авторизоваться или разлогиниться. Все эти действия объединяются в отдельном контроллере безопасности.

controllers/AuthController.js

'use strict';
const Base = require('areto/base/Controller');
module.exports = class AuthController extends Base {
  // place methods here
};
module.exports.init(module);

Капча

Помимо внутренних методов, действия контроллера могут определяться как отдельные классы. Для этого используется константа ACTIONS. Название свойства (captcha) определяет маршрут, а значение - параметры, по которым создается экземпляр класса. В данном случае, класс действие - это капча, защищающая от автоматической регистрации на сайте.

controllers/AuthController.js

...
static getConstants () {
  return {
    ACTIONS: {
      'captcha': {
        Class: require('areto/captcha/CaptchaAction'),
        minLength: 3,
        maxLength: 4,
        // fixedVerifyCode: '123'
      }
    }
  };
}
...

Регистрация

Регистрация и аутентификация доступны только для анонимных (isGuest) пользователей. Если пользователь залогинен, то ему отображается имя и ссылка выхода.

Для регистрации создается модель формы SignUpForm. Если текущий запрос уже содержит данные isPost, то они загружаются в модель, и вызывается метод регистрации, иначе же выводится пустая форма.

В случае ошибок регистрации, текущая форма отображается с соответствующими сообщениями. Если же все завершилось успешно, то происходит переадресация пользователя на страницу входа.

controllers/AuthController.js

...
actionSignup () {
  if (this.user.isGuest()) {
    let Form = require('../models/SignUpForm');
    let model = new Form({controller: this});
    if (this.isPost()) {
      model.load(this.getBodyParams());
        model.signUp(this.user, err => {
          err ? this.throwError(err)
              : model.hasError() ? this.render('signup', {model, user: this.user})
                                 : this.goLogin();
      });
    } else {
      this.render('signup', {model, user: this.user});
    }
  } else {
    this.render('signed', {model: this.user.identity});
  }
}
...

Аутентификация

Вход на сайт осуществляется через форму аутентификации. После успешной проверки пользователь пересылается на предыдущую страницу, с которой был направлен на вход.

controllers/AuthController.js

...
actionSignin () {
  if (this.user.isGuest()) {
    let Form = require('../models/SignInForm');
    let model = new Form({controller: this});
    if (this.isPost()) {
      model.load(this.getBodyParams());
        model.login(this.user, err => {
          err ? this.throwError(err)
              : model.hasError() ? this.render('signin', {model, user: this.user})
                                 : this.goBack();
      });
    } else {
      this.render('signin', {model, user: this.user});
    }
  } else {
    this.render('signed', {model: this.user.identity});
  }
}
...

Выход из системы

controllers/AuthController.js

...
actionLogout () {
  this.user.logout(err => {
    err ? this.render('signed', {model: this.user.identity})
        : this.redirect('/auth/signin');
  });
}
...