Persist Sessions
This commit is contained in:
parent
cd99027e70
commit
c1e65a2594
|
|
@ -1,5 +1,22 @@
|
||||||
|
import { Token } from "./Token";
|
||||||
|
|
||||||
export class Session
|
export class Session
|
||||||
{
|
{
|
||||||
userID:string;
|
userID:string;
|
||||||
token:string;
|
token:string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SerializedSession extends Token
|
||||||
|
{
|
||||||
|
userID:string;
|
||||||
|
|
||||||
|
static create( token:Token, userID:string )
|
||||||
|
{
|
||||||
|
let s = new SerializedSession();
|
||||||
|
s.expires = token.expires;
|
||||||
|
s.hashedIP = token.hashedIP;
|
||||||
|
s.id = token.id;
|
||||||
|
s.userID = userID;
|
||||||
|
return s;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -11,7 +11,7 @@ import { EmailService as EmailService } from "./email/EmailService";
|
||||||
import { TokenDB } from "./TokenDB";
|
import { TokenDB } from "./TokenDB";
|
||||||
import { UserManagementServerSettings } from "./UserManagementServerSettings";
|
import { UserManagementServerSettings } from "./UserManagementServerSettings";
|
||||||
import { RJLog } from "../log/RJLog";
|
import { RJLog } from "../log/RJLog";
|
||||||
import { Session } from "./Session";
|
import { SerializedSession, Session } from "./Session";
|
||||||
import { Role } from "./permissions/Role";
|
import { Role } from "./permissions/Role";
|
||||||
import { RolesData } from "./permissions/RolesData";
|
import { RolesData } from "./permissions/RolesData";
|
||||||
import { Files } from "../files/Files";
|
import { Files } from "../files/Files";
|
||||||
|
|
@ -28,6 +28,7 @@ import { Task } from "./scheduler/Task";
|
||||||
import { UserApp } from "./apps/UserApp";
|
import { UserApp } from "./apps/UserApp";
|
||||||
import { UserAppFactory } from "./apps/UserAppFactory";
|
import { UserAppFactory } from "./apps/UserAppFactory";
|
||||||
import { iTaskScheduler } from "./scheduler/iTaskScheduler";
|
import { iTaskScheduler } from "./scheduler/iTaskScheduler";
|
||||||
|
import { Token } from "./Token";
|
||||||
|
|
||||||
export class UserManagementServer
|
export class UserManagementServer
|
||||||
{
|
{
|
||||||
|
|
@ -49,6 +50,71 @@ export class UserManagementServer
|
||||||
_sessions:Map<string,Session> = new Map<string,Session>();
|
_sessions:Map<string,Session> = new Map<string,Session>();
|
||||||
_roles = new Map<string,Role>();
|
_roles = new Map<string,Role>();
|
||||||
|
|
||||||
|
getSessionData():SerializedSession[]
|
||||||
|
{
|
||||||
|
let sessionData:SerializedSession[] = [];
|
||||||
|
|
||||||
|
for ( let idsession of this._sessions )
|
||||||
|
{
|
||||||
|
let session = idsession[ 1 ];
|
||||||
|
let token = this.tokenDB._tokens.get( session.token );
|
||||||
|
let userID = session.userID;
|
||||||
|
let serializedSession = SerializedSession.create( token, userID );
|
||||||
|
|
||||||
|
sessionData.push( serializedSession );
|
||||||
|
}
|
||||||
|
|
||||||
|
return sessionData;
|
||||||
|
}
|
||||||
|
|
||||||
|
async saveSessionData():Promise<void>
|
||||||
|
{
|
||||||
|
if ( ! this._settings.persistSessions )
|
||||||
|
{
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
let sessionData = this.getSessionData();
|
||||||
|
await Files.saveJSON( this._settings.sessionsPath, sessionData );
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
async loadSessionData():Promise<void>
|
||||||
|
{
|
||||||
|
if ( ! this._settings.persistSessions )
|
||||||
|
{
|
||||||
|
return Promise.resolve();
|
||||||
|
}
|
||||||
|
|
||||||
|
let sessionsExist = await Files.exists( this._settings.sessionsPath );
|
||||||
|
|
||||||
|
if ( ! sessionsExist )
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let sessionData = await Files.loadJSON<SerializedSession[]>( this._settings.sessionsPath );
|
||||||
|
|
||||||
|
sessionData.forEach(
|
||||||
|
( sd )=>
|
||||||
|
{
|
||||||
|
let token = new Token();
|
||||||
|
token.id = sd.id;
|
||||||
|
token.hashedIP = sd.hashedIP;
|
||||||
|
token.expires = sd.expires;
|
||||||
|
|
||||||
|
this._tokenDB._tokens.set( token.id, token );
|
||||||
|
|
||||||
|
let session = new Session();
|
||||||
|
session.userID = sd.userID;
|
||||||
|
session.token = sd.id;
|
||||||
|
|
||||||
|
this._sessions.set( session.token, session );
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
_handlers:RequestHandler[] = [];
|
_handlers:RequestHandler[] = [];
|
||||||
|
|
||||||
_settings:UserManagementServerSettings;
|
_settings:UserManagementServerSettings;
|
||||||
|
|
@ -278,5 +344,8 @@ export class UserManagementServer
|
||||||
}
|
}
|
||||||
|
|
||||||
await this._scheduler.update();
|
await this._scheduler.update();
|
||||||
|
|
||||||
|
await this.loadSessionData();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -11,11 +11,13 @@ export class UserManagementServerSettings
|
||||||
httpsKeyPath:string;
|
httpsKeyPath:string;
|
||||||
httpsCertPath:string;
|
httpsCertPath:string;
|
||||||
emailKey:string;
|
emailKey:string;
|
||||||
|
persistSessions:boolean = true;
|
||||||
|
|
||||||
// Paths
|
// Paths
|
||||||
rootPath:string;
|
rootPath:string;
|
||||||
userDBPath:string;
|
userDBPath:string;
|
||||||
rolesPath:string;
|
rolesPath:string;
|
||||||
|
sessionsPath:string;
|
||||||
|
|
||||||
// Apps
|
// Apps
|
||||||
appsPath:string;
|
appsPath:string;
|
||||||
|
|
|
||||||
|
|
@ -53,6 +53,8 @@ export class LoginHandler extends RequestHandler
|
||||||
|
|
||||||
await this.userDB.save();
|
await this.userDB.save();
|
||||||
|
|
||||||
|
await this.ums.saveSessionData();
|
||||||
|
|
||||||
|
|
||||||
return this.sendDataInfo( "Login successfull", { token: session.token } );
|
return this.sendDataInfo( "Login successfull", { token: session.token } );
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -25,6 +25,9 @@ export class LogoutHandler extends RequestHandler
|
||||||
this._ums._sessions.delete( tokenID );
|
this._ums._sessions.delete( tokenID );
|
||||||
this._ums.tokenDB._tokens.delete( tokenID );
|
this._ums.tokenDB._tokens.delete( tokenID );
|
||||||
|
|
||||||
|
await this.userDB.save();
|
||||||
|
await this.ums.saveSessionData();
|
||||||
|
|
||||||
return this.sendInfo( "Logout successfull" );
|
return this.sendInfo( "Logout successfull" );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue