Строим блог на Areto фреймворк

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

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

controllers/AuthController.js

const Base = require('../component/BaseController');
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'
      }
    },
    BEHAVIORS: {
      'rejectSigned': {
        Class: require('areto/filter/AccessControl'),
        rules: [{
          actions: ['sign-in', 'sign-up'],
          roles: ['?']
        }],
        denyCallback: (action, user, cb)=> {
          action.render('signed', {
            model: user.model
          }, cb);
        }
      }
    }
  };
}

Регистрация

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

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

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

controllers/AuthController.js

actionSignUp () {
  let model = new SignUpForm({
    user: this.user
  });
  if (this.isGet()) {
    return this.render('sign-up', {model});
  }
  model.captchaAction = this.createAction('captcha');
  model.load(this.getBodyParams());
  async.series([
    cb => model.register(cb),
    cb => model.hasError()
      ? this.render('sign-up', {model})
      : this.goLogin()
  ], err => this.throwError(err));
}

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

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

controllers/AuthController.js

actionSignIn () {
  let model = new SignInForm({
    user: this.user
  });
  async.series([
    cb => model.resolveCaptchaScenario(cb),
    cb => {
      if (this.isGet()) {
        return this.render('sign-in', {model});
      }
      model.captchaAction = this.createAction('captcha');
      model.load(this.getBodyParams()).login(cb);
    },
    cb => model.hasError()
      ? this.render('sign-in', {model})
      : this.goBack()
  ], err => this.throwError(err));
}

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

controllers/AuthController.js

actionLogout () {
  this.user.logout(err => err ? this.throwError(err) : this.goHome());
}