Persist Sessions
This commit is contained in:
parent
cd99027e70
commit
c1e65a2594
|
|
@ -1,5 +1,22 @@
|
|||
import { Token } from "./Token";
|
||||
|
||||
export class Session
|
||||
{
|
||||
userID: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 { UserManagementServerSettings } from "./UserManagementServerSettings";
|
||||
import { RJLog } from "../log/RJLog";
|
||||
import { Session } from "./Session";
|
||||
import { SerializedSession, Session } from "./Session";
|
||||
import { Role } from "./permissions/Role";
|
||||
import { RolesData } from "./permissions/RolesData";
|
||||
import { Files } from "../files/Files";
|
||||
|
|
@ -28,6 +28,7 @@ import { Task } from "./scheduler/Task";
|
|||
import { UserApp } from "./apps/UserApp";
|
||||
import { UserAppFactory } from "./apps/UserAppFactory";
|
||||
import { iTaskScheduler } from "./scheduler/iTaskScheduler";
|
||||
import { Token } from "./Token";
|
||||
|
||||
export class UserManagementServer
|
||||
{
|
||||
|
|
@ -49,6 +50,71 @@ export class UserManagementServer
|
|||
_sessions:Map<string,Session> = new Map<string,Session>();
|
||||
_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[] = [];
|
||||
|
||||
_settings:UserManagementServerSettings;
|
||||
|
|
@ -278,5 +344,8 @@ export class UserManagementServer
|
|||
}
|
||||
|
||||
await this._scheduler.update();
|
||||
|
||||
await this.loadSessionData();
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -11,11 +11,13 @@ export class UserManagementServerSettings
|
|||
httpsKeyPath:string;
|
||||
httpsCertPath:string;
|
||||
emailKey:string;
|
||||
persistSessions:boolean = true;
|
||||
|
||||
// Paths
|
||||
rootPath:string;
|
||||
userDBPath:string;
|
||||
rolesPath:string;
|
||||
sessionsPath:string;
|
||||
|
||||
// Apps
|
||||
appsPath:string;
|
||||
|
|
|
|||
|
|
@ -53,6 +53,8 @@ export class LoginHandler extends RequestHandler
|
|||
|
||||
await this.userDB.save();
|
||||
|
||||
await this.ums.saveSessionData();
|
||||
|
||||
|
||||
return this.sendDataInfo( "Login successfull", { token: session.token } );
|
||||
}
|
||||
|
|
|
|||
|
|
@ -25,6 +25,9 @@ export class LogoutHandler extends RequestHandler
|
|||
this._ums._sessions.delete( tokenID );
|
||||
this._ums.tokenDB._tokens.delete( tokenID );
|
||||
|
||||
await this.userDB.save();
|
||||
await this.ums.saveSessionData();
|
||||
|
||||
return this.sendInfo( "Logout successfull" );
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue