|
|
/**
|
|
|
* 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();
|
|
|
});
|
|
|
}
|
|
|
});
|
|
|
});
|