Controle de sessão por usuário

Boa Tarde galera…

Vou deixar bem claro que sou novo em yii… Então, qualquer besteira que eu disser aqui, não levem em consideração.

Mas minha dúvida é a seguinte:

  • Tenho um sistema de atendimento controlado por login. Porém, gostaria que um usuário ficasse logado em apenas um local. Se eu fizer login em duas máquinas, a primeira perde a sessão.

Deu pra entender?? Tem como fazer isso??

Agradeço desde já.

use session por db, extenda CDbHttpSession para gravar o id do usuario numa coluna separada e ao fazer o login faça um delete nessa tabela onde o id for o mesmo do que o cara q ta logando

Cara, tem como me dar uma luz de como fazer isso? =S

Sou novo no Yii… to apanhando muito.

agora estou sem tempo

com mais tempo faço algo do genero e posto

mas basicamente faça o seguinte, em components na config


'session'=>array(

'class'=>'MinhaSession',

),

e cria uma class MinhaSession em protected/components




class MinhaSession extends CDbHttpSession{

//aqui sobrescreva os metodos necessários pra fazer o que vc quer, algo como

protected function createSessionTable($db,$tableName)

{

    $sql="

CREATE TABLE $tableName

(

id CHAR(32) PRIMARY KEY,

expire INTEGER,

data TEXT,

user INTEGER

)";

    $db->createCommand($sql)->execute();

}

}



Valew Gustavo… vou tentar!

me avisa se conseguiu, e se sim posta ae o que vc fez, se não vou arrumar um tempo logo pra te ajudar

Vixi cara, eu add isso na minha main.php:


'session' => 

array(

    'class' => 'system.web.CDbHttpSession',

    'connectionID'=>'db',

),



Ele automaticamente criou uma tabela com os seguintes campos:




CREATE TABLE IF NOT EXISTS `YiiSession` (

  `id` char(32) NOT NULL,

  `expire` int(11) DEFAULT NULL,

  `data` text,

  PRIMARY KEY (`id`)

) ENGINE=MyISAM DEFAULT CHARSET=latin1;



Para cada máquina que o usuário fizer o login, ele insere uma linha nesta tabela.

  • No campo id, ele gera uma string tipo MD5;

  • Em expire uma string;

  • Em data, ele gera uma string de acordo com a Sessão do usuário. Como o exemplo abaixo.




e0a5c774aa5358dae0232834f631d5a5__userInfo|a:8:{s:12:"id_atendente";s:1:"1";s:4:"nome";s:12:"Davi Crystal";s:5:"login";s:4:"davi";s:5:"senha";s:4:"1234";s:24:"id_historico_atendimento";s:3:"130";s:14:"seleciona_fila";s:1:"1";s:12:"senha_direta";s:1:"1";s:6:"status";s:1:"1";}e0a5c774aa5358dae0232834f631d5a5__id|s:4:"davi";e0a5c774aa5358dae0232834f631d5a5__name|s:4:"davi";e0a5c774aa5358dae0232834f631d5a5__states|a:0:{}



  • Quando o usuário perde a sessão ou faz o logout, esse campo data fica em branco. Se o usuário estiver logado e eu alterar a linha que corresponde ao usuário logado deixando o compo data em branco, o usuário logado perde a sessão.

Foi onde eu travei… Não consigo fazer o campo data ficar em branco caso o usuário faça o login em outro computador.

Pois não sei como ele gera essa string que ele salva no campo data.

Alguma luz?

Valew

PS: ele insere as informações no banco de dados, logo após o código abaixo caso valide o login:


if($model->validate() && $model->login()){

SiteController.php

opa to sabendo

por isso falei pra extender a original cdbhttpsession pq o id do cara fica no meio dos dados em data, e pra achar assim seria dificil

gravando sempre o id do usuario numa coluna diferente, uma query apenas basta, fazendo um delete where usuario=:usuario

ainda to sem tempo pra fazer uma classe assim

mas logo que puder posto ela completa

Entendi… vou ver aqui o que eu consigo fazer… Caso eu consiga fazer, eu posto aqui.

Depois de algum tempo, consegui resolver meu problema.

Como dito pelo Gustavo, Extendi a classe cdbhttpsession e criei o método abaixo:




public function readSession($id){

		

    $db = $this->getDbConnection();

    $toBind = array();

        

    $sql = "SELECT `data` FROM `{$this->sessionTableName}` WHERE `id`=:id ";

    $toBind[':id']=$id;        

       

    $sql .= "AND `expire`>:expire LIMIT 1";

    $toBind[':expire']=time();

		

    $data=$db->createCommand($sql)->queryScalar($toBind);

		

    if(!empty($data)){

        $sql = "DELETE FROM {$this->sessionTableName} WHERE data = :data  AND id <> :id";

        $db->createCommand($sql)->execute(array(':data'=>$data, ':id'=>$id));

    }		

    return (false === $data) ? '' : $data;

}



Valew

Show de bola, cara

Parabens

Provavelmente ainda vou usar isso

Cara, me ajuda! Já eu estou querendo criar várias sessions no mesmo! por exemplo: Quero que em cada guia um usuário diferente faça o login sem destruir a session anterior, ou seja criar outra session. Entente?