2021년 목표설정

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

cakephp 3.x 에서 인증 필드를 늘리는 방법

보통 인증할 때 아이디와 패스워드, 혹은 이메일과 패스워드 같이 2개의 필드를 가지고 값을 받아서 인증처리를 하는 경우가 많다.
cakephp3 역시 bake로 코드를 생성한 후 인증 페이지를 붙이려고 하면 기본적으로 username과 password 라는 두 개의 필드를 가지고 데이터베이스와 연동해서 회원인증을 처리한다.

그러나...때로는 회원코드나 계약코드 같이 추가적으로 필드를 추가해서 3개 혹은 그 이상의 값을 받아서 처리해야 할 경우가 있는데..cakephp 에서는 어떻게 처리를 할 것인가??

CakeDC/Users 라고 하는 플러그인이 있는 듯 싶은데 뭔가 복잡해 보이므로 우선 패스!!! ㅡ.ㅡㅋ
노가다로 만들어볼까 싶어서 찾아봤더니 답변이 적혀있길래 가져왔다..ㅋㅋ

방법은!!
우선 AppController.php에서 Auth Component를 로드시킬 때, scope에 필드명을 추가해준다. scope는 데이터베이스와 연동되어서 인증조건을 자동으로 제어해준다..예를 들어서, 고객번호 필드를 인증에 추가하고 사용플래그가 1인 레코드만 인증시키고 싶다면 이렇게 설정하면 별다른 예외처리 없이 바로 로그인 할 때 플래그 0인 경우 에러를 출력해준다.
> /src/Controller/AppController.php
  public function initialize()
    {
        parent::initialize();

        $this->loadComponent('RequestHandler');
        $this->loadComponent('Flash');

        /*
         * Enable the following components for recommended CakePHP security settings.
         */
        //$this->loadComponent('Security');
        //$this->loadComponent('Csrf');

        /*
         * 2017/09/14 by DONG
         * Auth Component Loading
         */
        $this->loadComponent('Auth',[
            'authorize' => ['Controller'],
            'authenticate' => [
              'Form' => [
                'fields' => [
                  'username' => 'user_id',
                  'password' => 'password'
                ],
                'scope'=>[
                  'customer_no' => 'customer_no', // 이 부분이 중요!!앞이 ctp의 필드명, 뒤가 DB의 필드명이다.
                  'is_valid' => 1, // 사용중 플래그가 1인 경우만 로그인 가능
                ]
              ]
            ],
            'loginAction' => [
              'controller' => 'Users',
              'action' => 'login',
            ],
            'loginRedirect' => [
              'controller' => 'Main',
              'action' => 'index'
            ],
            'logoutRedirect' => [
                'controller' => 'Users',
                'action' => 'login',
            ],
            'flash' => [
                 'element' => 'error'
            ],
            'authError' => '인증이 실패했습니다。',
            'unauthorizedRedirect' => $this->referer()
        ]);

        $this->Auth->allow(['logout','change']); // 인증 없이도 접근할 수 있는 페이지 설정
    }

로그인 화면은 다음과 같이 만들면 된다.
> 더 보기
    <div class="col-md-6 col-md-offset-3">
      <div class="panel panel-default">
        <div class="panel-heading">
          <span class="glyphicon glyphicon-lock"></span> 로그인
        </div>
        <div class="panel-body">
          <?= $this->Form->create(null,['class'=>'form-horizontal']) ?>
            <div class="form-group">
              <div class="col-xs-10 col-xs-offset-1">
                <?= $this->Form->input('customer_no', ['class' => 'form-control','label'=>'계약번호']) ?>
              </div>
            </div>
            <div class="form-group">
              <div class="col-xs-10 col-xs-offset-1">
                <?= $this->Form->input('user_id', ['class' => 'form-control','label'=>'로그인아이디','type' => 'text']) ?>
              </div>
            </div>
            <div class="form-group">
              <div class="col-xs-10 col-xs-offset-1">
                <?= $this->Form->input('password', ['class' => 'form-control','label'=>'패스워드']) ?>
              </div>
            </div>
            <div class="form-group last">
              <div class="col-sm-offset-4 col-sm-8">
                <?= $this->Form->button('리셋하기', ['type'=>'reset','class' => 'btn btn-default btn-sm']); ?>
                <?= $this->Form->button('로그인 하기', ['type'=>'submit','class' => 'btn btn-primary btn-sm']); ?>
              </div>
            </div>
          </div>
          <div class="panel-footer" align="right">
            <?= $this->Html->link('비밀번호 변경',['controller'=>'users','action'=>'change']); ?>
          </div>
        </div>
      </div>
    </div>

핵심이 되는 부분은 컨트롤러의 로그인 부분..보통 UsersController.php 에서 login() 함수를 만들고 그 안에 로직을 정의하니까 나도 그렇게 해 보겠어요 헛둘!!
> /src/Controller/UsersController.php
// 다른 부분은 생략하고 login 함수만 봅시다..
    public function login()
    {
      if ($this->request->is('post'))
      {
          //  인증양식에 계약번호 필드를 추가하기 위한 코드
          $customer_no = empty($this->request->data['customer_no']) ? 0 : $this->request->data['customer_no'];
          $this->Auth->config('authenticate.Form.scope.customer_no', $customer_no, true);
          $this->Auth->constructAuthenticate();
  // 여기서부터는 cakephp 메뉴얼에 나오는 로그인 ㅋㅋ
          $user = $this->Auth->identify();
            if ($user)
            {
              $this->Auth->setUser($user);
              return $this->redirect($this->Auth->redirectUrl());
            }
             else
             {
                // 로그인 실패했을 경우 에러 메세지 출력
                $this->Flash->error(__('ログインに失敗しました。ログイン情報をご確認ください。'));
             }
          }
      }

프레임워크라는 것이...쓰기 전에는 개념과 구조, 사용방법을 몰라서 멍...하다가 아주 기초적인 것에 익숙해지면 오오오오~엄청 편하군!! 이라는 생각이 들더라...그러다가 뭔가 좀 더 욕심내서 '이런 것도 만들어 볼까?' 하면...정해진 사용법이 아니라서 에러와 씨름하게 되고..온갖 편법과 꼼수와 얍삽이를 동원해가며 프레임워크의 틀에 맞게끔 개발하는 과정을 통해서 조금씩 성장하...고 있을까, 나는?? ㅋㅋㅋ 

댓글

이 블로그의 인기 게시물

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

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

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