Niszczenie określonej sesji w Code Igniter

notatka dla pracowników: to pytanie i związane z nim odpowiedzi są zablokowane, aby zapobiec dyskusji off topic wokół bieżącego wydarzenia , które jest związane z pytaniem pod ręką. Pytania dotyczące tego wydarzenia można je znaleźć na naszej meta stronie . Dziękuję!

Chcę mieć możliwość logowania użytkowników z mojej aplikacji wbudowanej w Code Igniter.

Wiem jak zakończyć aktywną sesję lokalną:

$this->session->sess_destroy();

Ale jak mogę zniszczyć sesję to zostało uruchomione na innym komputerze i tym samym wylogować użytkownika z sesji?

Przechowuję unikalny identyfikator powiązany z ich kontem w danych sesji, więc mogę go zobaczyć w tabeli sesji w bazie danych, ale jest on przechowywany wraz z innymi danymi sesji w kolumnie o nazwie user_data, której zawartość wygląda mniej więcej tak:

a:4:
{s:9:"user_data";s:0:"";s:6:"userid";s:6:"189034";s:9:"logged_in";b:1;s:5:"token";i:1767727789;}

Gdzie 189034 jest identyfikatorem użytkownika.

Czy istnieje sposób, aby w jakiś sposób wybrać wiersz w tabeli sesji na podstawie identyfikatora użytkownika, a następnie Usuń wiersz i zniszcz sesję. Czy jest inny sposób, aby to zrobić całkowicie?

Author: Community, 2012-03-05

3 answers

Utwórz nową kolumnę w tabeli ci_session.

ALTER TABLE `yourdatabase`.`ci_sessions` 
ADD COLUMN `userid` VARCHAR(45) NULL  AFTER `user_data` ;

Następnie w funkcji logowania uzyskaj id z procesu logowania i przed dodaniem informacji o danych użytkownika do sesji wykonaj:

//delete any existing sessions with the current userid session.
// Note - a new session has already been generated but doesn't have a value
// in the userid column, so won't get deleted.
$this->db->delete('ci_sessions',array('userid' => $identity));    

//get the current session and update it with the userid value.
$session_id = $this->session->userdata('session_id');
$this->db->where('session_id', $session_id);
$this->db->update('ci_sessions', array('userid' => $identity));

Gdzie $identity jest twoim identyfikatorem użytkownika. To usuwa wszystkie poprzednie sesje i oznacza, że tylko jedna istnieje na raz.

 30
Author: Stevo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 20:41:15

Istnieje funkcja do niszczenia niektórych elementów / sesji, które chcesz

$this->session->unset_userdata('session_name')

I aby umożliwić jednemu użytkownikowi zalogowanie się na jednym komputerze na raz lub w jednej przeglądarce na raz, możesz przeczytać więcej tutaj

Zezwalaj tylko na jedną sesję na raz

 4
Author: Hieu Van Mach,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:25:26

Jednym z problemów z serializowanymi danymi jest to, że nie ma legalnego sposobu na ich odpytywanie. Musisz zebrać wszystkich użytkowników w sesji (może to być lot ) i rozpakować DANE, sprawdzić wartość, a następnie usunąć wiersz w tabeli sesji, skutecznie niszcząc tę sesję.

foreach ($this->db->get('sessions')->result() as $session)
{
    $data = unserialize($session->user_data);

    if ( ! isset($data['user_id'])) continue;

    if ($data['user_id'] === $id_to_delete)
    {
        // delete the row
            $this->db->where('session_id', $session->session_id)
                ->delete('sessions');
    }
}
Prawdopodobnie zniechęciłbym do tego. Każdy użytkownik w Twojej witrynie, zalogowany lub nie, ma sesję, którą należy wybrać, i pamiętaj: jeden użytkownik może mieć więcej niż jedną sesję więc musiałbyś przejrzeć wszystkie.

Innym rozwiązaniem może być dodanie niestandardowej kolumny do tabeli sesji z id użytkownika (lub hash id). Coś, co możesz zapytać, aby szybko znaleźć sesję użytkownika. Następnie, po dodaniu user_id do sesji, wypełnij tę kolumnę, a gdy musisz usunąć sesję za pomocą user_id, można to zrobić szybko i skutecznie.

 3
Author: Wesley Murch,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-05 08:59:51