Skip to content
This repository was archived by the owner on Mar 2, 2025. It is now read-only.

this.user

do- edited this page Nov 4, 2019 · 38 revisions

Table of Contents

Общие слова

Поле обработчика user, доступное на этапе исполнения метода модуля как this.user, предназначено для представления данных о пользователе, от имени которого совершается текущая операция.

Если приложение хранит учётные записи своих пользователей, в таблице БД (типовое имя — users), то обычно this.user по набору полей и их содержимому соответствует одной из записей этой таблицы, по крайней мере частично. Такую логику средствами Dia.js легко реализовать, однако на уровне ядра системы она не зафиксирована.

Конкретика

До вызова метода обработчик делает, упрощённо говоря, следующее:

  if (!this.is_anonymous ()) {
    this.session = this.getSession ()
    this.user    = this.getUser    () // this.session.getUser ()
  }

По умолчанию is_anonymous () возвращает true и оба значения получаются пустыми. Если это требуется исправить, нужно добавить немного логики на уровне приложения, реализовав местное представление о сессии.

Сессия в Dia.pm — это объект:

  • возвращаемый методом getSession () обработчика;
  • реализующий методы:
    • start ();
    • getUser ();
    • finish ().
В качестве переменной API сессия (в отличие от ресурсов) предполагается не долгоживущей, а столь же одноразовой, как сам обработчик. Собственно говоря, это часть обработчика, вынесенная в отдельный объект для облегчения читаемости кода.

В структуре директорий файлы классов сессий, связанных c протоколом HTTP, должны располагаться в back/lib/Content/Handler/HTTP. Для многих используемых на практике схем аутентификации можно воспользоваться имеющимися в ядре Dia.pm базовыми классами.

Аутентификация и выход

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

  do_create_sessions: async function () {
    // ... проверки и прочие вычисления ...
    this.user = // ... откуда его брать 
    await this.session.start ()
  },
 
  do_delete_sessions: async function () {
    await this.session.finish ()
  }

Значение, присвоенное this.user перед this.session.start () далее будет доступно в качестве this.user на входе в каждый метод в серии связанных (например, cookie) запросов, пока либо не будет вызвано this.session.finish (), либо со времени запроса не истечёт время, устанавливаемое в реализации getSession () текущего обработчика — обычно это тот или иной параметр конфигурации.

Подробнее об анонимности

Описанный разделом выше do_create_sessions -- такой же метод приложения, как и все прочие. Соответственно, по умолчанию до его вызова обработчик попытается установить текущего пользователя. Чтобы предотвратить этот абсурд, нужно соответствующим образом переопределить у обработчика упомянутый ещё раньше метод is_anonymous ():

  is_anonymous () {
    return this.rq.type == 'sessions' && this.rq.action == 'create'
  }

Так выглядит данный метод в обработчиках Web-приложений, требующих обязательной аутентификации для всех запросов (кроме самого login'а). Для сайтов с публичной частью условие может быть гораздо слабее, а обработчики запросов mashine-to-mashine могут вообще игнорировать понятие "пользователя" и, тем более, механизм сессий.

Если is_anonymous () всё-таки вернул false, то, как мы знаем, вызывается getSession ().getUser (). Если объект сессии не может вычислить пользователя по параметрам запроса, в норме он должен вызвать метод обработчика no_user () и вернуть его результат. У обработчика HTTP это приводит к выбросу 401 Unauthorized, но у его наследников может быть переопределено, например, на выдачу специальной анонимной учётной записи.

Clone this wiki locally