Session.js
100 lines
| 5.1 KiB
| application/javascript
|
JavascriptLexer
|
|
r0 | /** | |
| * Created by andrei on 08.04.16. | |||
| */ | |||
| define([ | |||
| "dojo/_base/declare", | |||
| "dojo/_base/lang", | |||
| "dojo/when", | |||
| "implab/safe", | |||
| "../ForbiddenException"], | |||
| function (declare, lang, when, safe, ForbiddenException) { | |||
| return declare(null, { | |||
| _container: null, | |||
| _sessionData: null, | |||
| /** | |||
| * Создавать анонимную сессию. Если прозрачная аутентификация не | |||
| * проводилась, и текущей сессии нет, то может быть создана сессия | |||
| * для анонимного пользователя. Это сделано опцией, поскольку не во | |||
| * всех системах требуется, отслеживать активность анонимных | |||
| * пользователей (это не бесплатно). | |||
| */ | |||
| _createAnonymousSession: false, | |||
| /** | |||
| * Регистрировать пользователей, полученных из внешнего источника | |||
| * аутентификации. | |||
| */ | |||
| _autoRegisterUsers: false, | |||
| constructor: function (options) { | |||
| safe.argumentNotNull(options, "options"); | |||
| safe.argumentNotNull(options.container, "options.container"); | |||
| this._container = options.container; | |||
| this._createAnonymousSession = options.createAnonymousSession || this._createAnonymousSession; | |||
| this._autoRegisterUsers = options.autoRegisterUsers || this._autoRegisterUsers; | |||
| this._sessionData = this._initSession(); | |||
| }, | |||
| getSessionData: function () { | |||
| return this._sessionData; | |||
| }, | |||
| /** | |||
| * @remarks Сосздание/восстановление сессии происходит в несколько | |||
| * этапов 1. Получаем текущую сессию. 2. Если упешно, то | |||
| * выходим. 3. Получаем идентификатор пользователя, | |||
| * используя identityProvider 4. Если успешно 5. Создаем | |||
| * новую сессию для полученного пользователя, выходим 6. | |||
| * Иначе если установлен параметр _createAnonymousSession 7. | |||
| * Создаем новую анонимную сессию. 8. Иначе, выходим | |||
| */ | |||
| _initSession: function () { | |||
| let me = this; | |||
| let securityAuthority = me._container.getService("securityAuthority"); | |||
| let securityProvider = me._container.getService("securityProvider"); | |||
| let identityProvider = me._container.getService("identityProvider"); | |||
| if (!securityAuthority) | |||
| throw new Error("Sessions are not supported, no security authority is supplied"); | |||
| // пытаемся получить текущую сессию | |||
| return when(securityAuthority.getSession(), function (session) { | |||
| if (session) | |||
| return session; | |||
| // пытаемся создать сессию с использованием | |||
| // пользователя из внешнего | |||
| // источника аутентификации | |||
| if (identityProvider) { | |||
| return when(identityProvider.getUserLogin(), function (login) { | |||
| if (login) { | |||
| return when(securityProvider.createUserIdentity(login, false, { | |||
| createUser: me._autoRegisterUsers | |||
| }), function (uid) { | |||
| return securityAuthority.initSession(uid); | |||
| }, function (err) { | |||
| console.log("Failed to create session for '" + login + "' ", err); | |||
| throw new ForbiddenException(); | |||
| }); | |||
| } else if (me._createAnonymousSession) { | |||
| return when(securityProvider.getAnonymousIdentity(), function (uid) { | |||
| return securityAuthority.initSession(uid); | |||
| }); | |||
| } else { | |||
| throw new ForbiddenException(); | |||
| } | |||
| }); | |||
| } else if (me._createAnonymousSession) { | |||
| return when(securityProvider.getAnonymousIdentity(), function (uid) { | |||
| return securityAuthority.initSession(uid); | |||
| }); | |||
| } | |||
| throw new ForbiddenException(); | |||
| }); | |||
| } | |||
| }); | |||
| }); |
