userSessionManager

Dieser Bereich dient dazu, eure Tricks und Erweiterungen vorzustellen, damit diese auch andere Anwender nutzen können. // This area can be used to publish your tricks and extensions to the APF to be used by other developers.
Antworten
Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

userSessionManager

Beitrag von Screeze » 20.09.2009, 18:42:24

Wer eine Möglichkeit braucht einen eingeloggten User in einem Folgerequest wiederzuerkennen, dem könnte folgendes helfen:

Der userSessionManager speichert nach einem erfolgreichem Login die Id des users zusammen mit der Zeit der letzten aktivität, und speichert diese innerhalb der Session.
Desweiteren wird immer das aktuelle User-Objekt geladen und bereitgestellt.
Sollte ein User länger als 30 minuten keine aktivität gezeigt haben, wird er ausgeloggt. Die Zeit kann angepasst werden wie ihr sie braucht. (die zahl 1800 suchen und ersetzen durch die sekunden die ihr braucht.)

Diese Ordnerstruktur wird verwendet:
.../mytools/userSessionManager/biz/
Darin braucht ihr 3 dateien:

userSessionManager.php: Der eigentliche Manager, der als SessionSingleton benutzt wird.

Code: Alles auswählen

<?php
/**
* Handles users session. (Use as SessionSingleton)
*
* @namespace mytools::userSessionManager::biz
* @author Ralf Schubert
* @version 0.1, 20.09.2009
*/
class userSessionManager extends coreObject {
    /**
     * @var int Contains current user Id
     */
    protected $__userId = null;
    
    /**
     * @var int Contains Unix-timestamp from last User Action
     */
    protected $__lastAction = null;

    /**
     * @var <type> Contains User Object
     */
    public $user = null;


    /**
     * Sets a User as loggedIn
     * @param int $userId User Id
     */
    public function setUser($userId){
        $this->__userId = $userId;
        $this->__lastAction = time();
        $this->check();
    }

    /**
     * Updates client information.
     * @return boolean Returns true if user is logged in, otherwise returns false.
     */
    public function check(){
        // Check if User was already logged in
        if($this->__userId !== null){
            // Check if Users last action was within 30 minutes
            if($this->__lastAction >= (time()-1800)){
                // get the business object
                $uM = &$this->__getAndInitServiceObject('modules::usermanagement::biz','umgtManager','Default');
                // get userdata
                $user = $uM->loadUserById($this->__userId);
                
                if($user === null){ 
                    // User doesn't exist anymore
                    $this->logout();
                    return false;
                }
                else {
                    // User is loggedIn
                    $this->__lastAction = time();
                    unset($uM);
                    //save User
                    $this->user = $user;
                    return true;
                }
            
            } 
            else { // LastAction too far away
                $this->logout();
                return false;
            }
        }
        else // User wasn't loggedin
            return false;
    }

    /**
     * User logout
     */
    public function logout(){
        $this->__userId = null;
        $this->__lastAction = null;
        $this->user = null;
    }

    /**
     * Prevent the user object from being serialized.
     */
    public function __sleep(){
        return array('__userId', '__lastAction', '__Attributes', '__Children', '__Context', '__Language', '__ObjectID', '__ParentObject', '__ServiceType');
    }
}
?>
usmCheckAction.php Wir werden später die Action registrieren, um vor der generierung der Seite die Session des Users zu prüfen

Code: Alles auswählen

<?php
import('mytools::userSessionManager::biz', 'userSessionManager');

class usmCheckAction extends AbstractFrontcontrollerAction{
    public function run(){
        $uSM = &$this->__getServiceObject('mytools::userSessionManager::biz','userSessionManager','SESSIONSINGLETON');
        $uSM->check();
    }
}

?>
usmCheckInput.php Die zur Action gehörende Input datei hat keine wirkliche funktion, wird aber benötigt.

Code: Alles auswählen

<?php
class usmCheckInput extends FrontcontrollerInput{
    function usmCheckInput(){
    }
}
?>
Desweiteren ist eine action-configuration nötig unter:
/config/mytools/userSessionManager/biz/actions/[euer context]/DEFAULT_actionconfig.ini

Code: Alles auswählen

[usmCheckAction]
FC.ActionNamespace = "mytools::userSessionManager::biz"
FC.ActionFile = "usmCheckAction"
FC.ActionClass = "usmCheckAction"
FC.InputFile = "usmCheckInput"
FC.InputClass = "usmCheckInput"
FC.InputParams = ""
Somit wäre die Grundlage geschaffen.

Die einbindung erfolgt folgendermaßen:
In eurer bootstrap-datei (z.b. index.php) wird beim FrontController eine Action registriert, die immer die usersession auswertet, noch bevor die eigentliche seite generiert wird.
Das könnte z.b. so aussehen:

Code: Alles auswählen

$fC = &Singleton::getInstance('Frontcontroller');
$fC->set('Context','sites::EUERCONTEXT');
$fC->registerAction('mytools::userSessionManager::biz','usmCheckAction'); // Hier wird die action registriert!
$fC->start('sites::EUERCONTEXT::pres::templates','index'); 
Dann muss nurnoch bei der Behandlung eures Logins folgendes eingebaut werden, an einer Stelle, die nur zutrifft wenn der Login erfolgreich war:

Code: Alles auswählen

$uSM = &$this->__getServiceObject('modules::usermanagement::biz','userSessionManager','SESSIONSINGLETON');
$uSM->setUser($DieIdEueresUsers);
setUser() wird dabei die Id des zu behandelnden Users übergeben.

An das Userobjekt kommt man folgendermaßen: (sollte der user eingeloggt sein. andernfalls ist die variable null)

Code: Alles auswählen

$uSM->user
um einen logout zu vollziehen reicht folgender aufruf:

Code: Alles auswählen

$uSM = &$this->__getServiceObject('modules::usermanagement::biz','userSessionManager','SESSIONSINGLETON');
$uSM->logout();
Bugs und vorschläge bitte immer her ;)

Screeze

Benutzeravatar
Screeze
Beiträge: 1920
Registriert: 05.08.2009, 09:49:04
Kontaktdaten:

Re: userSessionManager

Beitrag von Screeze » 02.10.2009, 18:44:37

Hier die überarbeitete Version, zusammen mit dem aktuelle userSettingsManager, denn dieser wird benutzt.

änderungen:
1. configurationsdatei eingebaut (für eigenen umgtmanager einsetzen, und timeout zeit festsetzen)
2. userSettingsManager support. der settingsmanager wird jetzt vom uSM verwaltet und auch benutzt. über

Code: Alles auswählen

$usm->userSettings
Kann direkt auf den settingsmanager zugegriffen werden.
3. einbau der user_agent prüfung:
es wird nach einer userSetting namens "user_agent_secure" gesucht, sollte diese auf "true" gesetzt sein, wird geprüft ob der userAgent des vorigen requests mit dem aktuellen übereinstimmt, und falls nicht ausgeloggt.

Es werden 2 configs gebraucht:
/config/userSessionManager/biz/{CONTEXT}/DEFAULT_userSessionManager.ini

Code: Alles auswählen

[General]
umgtManager.namespace = "modules::usermanagement::biz"
umgtManager.name = "umgtManager"
session.timeout = "1800"
/config/userSessionManager/biz/actions/{CONTEXT}/DEFAULT_actionconfig.ini

Code: Alles auswählen

[usmCheckAction]
FC.ActionNamespace = "mytools::userSessionManager::biz"
FC.ActionFile = "usmCheckAction"
FC.ActionClass = "usmCheckAction"
FC.InputFile = "usmCheckInput"
FC.InputClass = "usmCheckInput"
FC.InputParams = ""
Einfach in euer bootstrap datei die action

Code: Alles auswählen

$fC->registerAction('mytools::userSessionManager::biz','usmCheckAction');
registrieren.

Und dann wo ihr wollt so drauf zugreifen

Code: Alles auswählen

$uSM = &$this->__getServiceObject('mytools::userSessionManager::biz','userSessionManager','SESSIONSINGLETON');
public sind "user" und "userSettings" ersteres ist das user object, letzteres die user settings. (beides null wenn user nicht eingeloggt)


Für den userSettingsmanager wird eine db-tabelle benötigt.
dafür findet ihr in /mytools/userSettingsManager/data/ eine setup.sql

Hmm ich glaub ich hab irgendwas vergessen, weiß aber grad nicht was ;) sagt bescheid wenn ihr nicht zuechtkommt.
Dateianhänge
mytools-sessionAndSettings.rar
(3.87 KiB) 77-mal heruntergeladen

Antworten

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 2 Gäste