2021년 목표설정

이미지
기본적으로 작년에 달성하지 못한 것들을 하려고 생각중인데..코로나가 언제까지 이어질지, 한국이나 북해도는 갈 수 있을지..자격증은 응시 가능할지..여러가지가 불확실하다. 2021년은 무엇보다 정신적인 부분과 경제적인 부분에 중점을 두고 조금 더 치열하게 지내보고 싶다. 일본나이로도 30대 마지막 해, 이제 불혹에 접어드는 나이..복잡하지만 심플하게. 육체적목표 : 트라이에슬론 스탠다드 도전하기 정신적 : 자격증2개 도전 + 자체개발 서비스 론칭 가족적 : 가정의 평화를 유지하기 경제적 : 외식과 유흥비를 줄이고 부수입을 늘려서 결과적으로 저축하기 사회적 : 목표세미나를 포함해서 민단과 개인인맥의 활성화와 교류를 촉진하기

cakephp3 에서 복수의 사용자가 로그인 불가능하게 하기

예를 들어서 동시에 같은 컴퓨터의 다른 브라우저에서 같은 아이디로 로그인 하거나, 다른 컴퓨터에서 같은 아이디로 로그인 하는 경우.
방법은 여러가지가 있지만 가장 간단하게 내가 처리한 방법은 토큰을 발행해서 디비와 세션에 저장한 후, 그 둘을 비교해서 일치하지 않는 경우에는 이전에 로그인 한 사용자 세션을 끊어버리는 방법이다.
즉 로그인 한 사용자가 있는데 다른 사용자가 로그인 한 경우에 디비의 토큰값이 변하므로 세션에 가지고 있는 토큰과 디비에 저장되어 있는 토큰이 다르게 되므로 그 경우에 세션 삭제하고 로그아웃 시켜버렸다.

단점이라면 매번 페이지 열 때마다 체크를 해 줘야 한다는 점...cakephp3에서는 beforeFilter() 를 이용하면 모든 페이지에 적용하지 않아도 자동으로 페이지 로딩하면서 실행을 해 준다.
주석 일본어로 달았는데 뭐 아무도 안 볼테니 ㅋㅋㅋㅋ
> 소스코드 보기
// UsersControllerのLogin()中 // ログインの時間制限があるのか判断するための処理(例外処理必要) $query = $this->Users->find()->where( ['account' => $this->request->data['account'], 'customer_no' => $this->request->data['customer_no'] ]); $targetUser = $query->first();   $this->Users->initUser($targetUser); // トークンを発行するためのFunction $user = $this->Auth->identify(); if ($user) { $this->Auth->setUser($user); return $this->redirect($this->Auth->redirectUrl()); } // UsersControllerのLogout()中 // ログイン状態の利用者情報をセッションから読み取る。 $account = $this->Auth->User('account'); $customer_idx = $this->Auth->User('customer_idx'); // DBのTokenをNullに更新 $query = $this->Users->query(); $query->update() ->set(['token' => null, 'modifier' => $account, 'modified' => Time::now()]) ->where(['customer_idx' => $customer_idx, 'account' => $account]) ->execute(); //ログアウト処理、セッションを消してログインページに移動させる。 $this->request->session()->destroy(); $this->Flash->success(__('成功的にログアウトしました。')); return $this->redirect($this->Auth->logout()); // UsersTable.phpのinitUser()の定義 public function initUser($targetUser) { //ログイン成功時、ランダムでトークンを発行する。 $token = hash('sha256', date("YmdHis").$_REQUEST['customer_no']); $target->token = $token; $this->save($targetUser); } // AppController.phpのBeforeFilter public function beforeFilter(Event $event) {  // 二重認証をチェックする // セッションとトークンをチェックしてなかったら強制ログアウト、  // あればセッションのトークン値とDBのトークン価を比較する。 // トークン値が一致する場合は何もしなくていい、  // 不一致する場合はそのセッションを破棄しログインページに戻す。 // セッションを比較するための準備 $session_token = $this->Auth->user('token'); if(isset($session_token)) {   $account = $this->Auth->user('account'); $customer_idx = $this->Auth->user('customer_idx'); $query = $this->Users->find()->where(    ['account' => $account, 'customer_idx' => $customer_idx ]); $user = $query->first(); $db_token = $user->token; // セッションのトークン価とDBのトークン価が一致しない場合は、強制的にログアウトさせる。 if($session_token != $db_token) { $this->Session->destroy(); $this->Flash->warning(__('トークン価が更新されましたのでログアウトされました。')); $this->redirect($this->Auth->logout()); } } }  

댓글

댓글 쓰기

이 블로그의 인기 게시물

[메모] PostgreSQL에서 Insert 하는 경우 자동채번 PK가 중복에러 나는 경우

[C# & LINQ] 랜덤으로 데이터를 한 개 추출하는 방법

[react-native] uuid 생성이 에러가 날 때 대처법