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

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

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

controllers/AuthController.js

const Base = require('../component/BaseController');
module.exports = class AuthController extends Base {
  static getConstants () {}
  async actionSignUp () {}
  async actionSignIn () {}
  async actionLogout () {}
};
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: ['?']
        }],
        denyPromise: (action, user)=> {
          return action.render('signed', {
            model: user.model
          });
        }
      }
    }
  };
}

Регистрация

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

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

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

controllers/AuthController.js

async 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());
  await model.register();
  return model.hasError()
    ? this.render('sign-up', {model})
    : this.goLogin();
}

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

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

controllers/AuthController.js

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

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

controllers/AuthController.js

async actionLogout () {
  await this.user.logout();
  this.goHome();
}