2016-04-11 18 views
2

Elde edilmesi gereken şey, yöneticinin relogin'i zorlamak için verilen kullanıcının oturumunu kaldırma yetkisine sahip olmaktır. Bu, örneğin kullanıcı izinleri değiştiğinde kullanışlı olabilir. Oturum ve kullanıcı birlikte nasıl bağlanılır, böylece diğer kullanıcılar bu verilere erişebilir?CakePHP3'te belirli bir kullanıcı için oturum nasıl silinir?

Veritabanı oturum deposu kullanıyorum, bu nedenle veritabanından kayıt kaldırma zorla yeniden sonuçlanacak. Ayrıca kimlik doğrulama, Auth bileşenini temel alır.

$this->loadComponent('Auth', [ 
      'loginAction' => [ 
       'controller' => 'Auth', 
       'action' => 'login' 
      ], 
      'loginRedirect' => "/home", 
      'logoutRedirect' => [ 
       'controller' => 'Auth', 
       'action' => 'login' 
      ], 

      'authError' => "You have no permissions to access resource ${url}. Contact system administrator.", 
      'storage' => 'Session', 
      'authenticate' => [ 
       'Form' => [ 
        'userModel' => 'User', 
        'finder' => 'user', 
        'fields' => ['username' => 'name', 'password' => 'password'] 
       ] 
      ], 
      'authorize' => ["Controller"] 
     ]); 

Ve oturum depolamasını:

İşte benim İlgili config bazı olduğunu ben veritabanı güncelleme kodu yerleştirebilirsiniz nereye işaretlediğiniz Aşağıda

'Session' => [ 
     'defaults' => 'database', 
] 

. Oturum açma işleminden sonra maalesef, oturum "kimliğini" alır ve böylece kimlik değişir. Sonuç olarak, giriş işleminde yapılan değişiklikler yeniden yönlendirme sonrasında görünmez.

Girişi eylemi: değerli görüş ve saptar için

public function login() 
{ 
    $form = new LoginForm(); 
    if ($this->request->is('post')) { 
     if ($form->validate($this->request->data)) { 
      $user = $this->Auth->identify(); 
      if ($user) { 
       $this->Auth->setUser($user); 
       // here would be good place to update the database 
       return $this->redirect($this->Auth->redirectUrl()); 
      } else { 
       $this->Flash->error("Invalid security credentials provided"); 
      } 
     } else { 
      $this->Flash->error("Invalid login form"); 
     } 
    } 
    $this->set('loginForm', $form); 
} 
+0

auth bileşeni oturum belleğine yazıldığında oturum yenileniyor, bu yüzden "$ this-> Auth-> setUser()" işlevini çağırdıktan sonra oturum kimliğine erişilmesi gerekir. Tam olarak ne denedin? – ndm

+0

Tam olarak bahsettiklerinizi denedim. Yukarıdaki kodda, yorumun yapıldığı yerde (setUser'den sonra) veritabanı içeriğini değiştirdim ancak bu yeniden yönlendirme veya yeni istek sonrası geçersiz kılınır – Antoniossss

+0

Biraz daha hassas olmanız, ideal olarak kullandığınız kodu göstermeniz ve açıklamanız gerekir. tam olarak "_gets overriden_" demek, _what_ _what_ _what_ data ile geçersiz kılınmış mı? – ndm

cevap

0

@ndm teşekkürler.

@ ndm adlı kullanıcının yorumlarına teşekkürler (muhtemelen) canlı bir çözüm bulduk. Oturum veri kaydetme sürecine bazı kodları enjekte etmem gerekti. Bunu yapmak için, geri arama rolünde özel SessionHandler ve PHP'nin Cloasure kullandım.

class UserSession extends DatabaseSession 
{ 
    public $callback; 
    public function write($id, $data) 
    { 
     $result = parent::write($id, $data); 
     if ($this->callback) { 
      call_user_func($this->callback,$id); 
     } 
     return $result; 
    } 
} 

ve eylem

 $user = $this->Auth->identify(); 
     if ($user) { 
      $this->Auth->setUser($user); 
      /** @var UserTable $model */ 
      $model = $this->loadModel("User"); 
      $handler = $this->Session->engine(); 
      /** @var UserSession $handler */ 
      $handler->callback = function ($id) use ($model, $user) { 
       $model->updateSession($id, $user['id']); 
      }; 
      return $this->redirect($this->Auth->redirectUrl()); 
     } 

Bu şekilde, DB oturum satır oturum verileri SONRA güncellenir giriş veritabanına temizlendi.

Şimdi, belirli bir kullanıcı için tüm oturumları sorgulayabilir ve gerektiğinde bu kullanıcı için relogin zorlayarak bunları silebilirim. Geri arama, kullanıcı girişi üzerine sadece bir kez denir whitch her http isteği sırasında hem iyileştirmesi ve UPDATE sorgu db kaçınma konusunda amacım oldu (yani hem çözüm olacaktır çünkü ancak bu kaçmak istedim)

İlgili konular