<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                ## 創建用戶表 利用migration創建一個用戶表 ``` php think migrate:create Users ``` ## 編寫 migration ``` public function change() { $table = $this->table('users', ['engine' => 'InnoDB']); $table->addColumn('name', 'string',['limit' => 50, 'default'=>'','comment'=>'用戶名']) ->addColumn('email', 'string',['limit' => 255, 'default'=>'','comment'=>'郵箱']) ->addColumn('password', 'string',['limit' => 255, 'default'=>'','comment'=>'密碼']) ->addColumn('remember_token', 'string',['limit' => 255, 'default'=>'','comment'=>'記住token']) ->addColumn('login_ip', 'string',['limit' => 50, 'default'=>'','comment'=>'登錄IP']) ->addColumn('login_at', 'timestamp', [ 'comment' => '最近登錄時間']) ->addColumn('created_at', 'timestamp', [ 'comment' => '更新時間']) ->addIndex(['name'], ['unique' => true]) ->create(); } ``` ## 創建用戶表 ``` php think migrate:run ``` 以上步驟可以成功創建用戶表了 ## 創建User模型 ``` namespace app\model; class UserModel extends AbstractBase { public function store($data) { // TODO: Implement store() method. $this->data($data); return $this->save(); } public function deleteBy($id) { // TODO: Implement deleteBy() method. return $this->where('id', $id)->delete(); } public function updateBy($id, $data) { // TODO: Implement updateBy() method. return $this->where('id', $id)->update($data); } public function findBy($id) { // TODO: Implement findBy() method. return $this->where('id', $id)->findOrEmpty(); } /** * 根據 NAME 查找 * @param $name * @return array|null|\PDOStatement|string|\think\Model */ public function findByName($name, $id = null) { $where = [ 'name' => $name, ]; if ($id) { $where['id'] = ['<>', $id]; return self::where($this->conditions($where))->find(); } return self::where($where)->find(); } /** * 根據 EMAIL 查找 * @param $email * @param null $id * @return array|null|\PDOStatement|string|\think\Model */ public function findByEmail($email, $id = null) { $where = [ 'email' => $email, ]; if ($id) { $where['id'] = ['<>', $id]; return self::where($this->conditions($where))->find(); } return self::where($where)->find(); } } ``` 模型創建成功之后了,下面開始實現登錄。 ## 登錄的實現 創建 app\traits\Auth.php 認證文件,簡化一下實現思路。以及幾個功能點。 > 1.必須登錄成功 2.需要記住功能 記住的實現,肯定利用到了Cookie,需要對remember_token進行認證便可以了。 下面看一下代碼的實現。 ``` namespace app\traits; use think\Request; use think\Validate; use think\facade\Session; use think\facade\Cookie; use app\model\UserModel as User; trait Auth { public function authLogin(Request $request) { $err = $this->validateLogin($request); if ($err) { $this->error($err); } // 正常輸入登錄 $userModel = new User(); $filed = explode('|', $this->name()); $user = $userModel::where($filed[0], $request->param($filed[0]))->findOrEmpty(); if (!$user) { $this->error('登錄失敗'); } if (password_verify($request->param('password'), $user->password)) { Session::set('user', $user); // 記住登錄 $this->LoginRemember($user, $request); $this->success('登錄成功', url($this->redirect)); } $this->error('登錄失敗'); } /** * 記住登錄 * @return bool */ public function rememberLogin() { // 如果記住登錄 if (!Session::get('user') && Cookie::get('remember_token') && $this->checkRememberToken()) { return true; } return false; } /** * 退出 * @return void */ public function authLogout() { $user = Session::get('user'); $user->remember_token = null; $user->save(); Cookie::delete('remember_token'); Session::delete('user'); } /** * 驗證 * @param Request $request * @return array|bool */ protected function validateLogin(Request $request) { $validate = new Validate($this->rule()); if (!$validate->check($request->except(['remember']))) { return $validate->getError(); } return false; } /** * 登錄驗證規則 * @return array */ protected function rule() { return [ $this->name() => 'require|token|alphaDash', 'password|密碼' => 'require|alphaDash', //'captcha|驗證碼' => 'require|captcha' ]; } /** * 設置登錄字段 * * @return string */ protected function name() { return 'name|用戶名'; } /** * Remember Token * * @return string */ public function generateRememberToken() { return uniqid(md5(time()+rand(10000, 99999))); } /** * 加密 TOKEN * * @param $user_id * @param $remember_token * @return string */ protected function secretRememberToken($user_id, $remember_token) { list($key, $method, $iv) = $this->getSecret(); return base64_encode(openssl_encrypt($user_id . ':' . $remember_token, $method, $key, OPENSSL_RAW_DATA, $iv)); } /** * 檢查remember token 是否正確 * * @return bool */ protected function checkRememberToken() { if (!Cookie::has('remember_token')) { return false; } $rememberToken = Cookie::get('remember_token'); // 解密 list($key, $method, $iv) = $this->getSecret(); list($userID) = explode(':', (openssl_decrypt(base64_decode($rememberToken), $method, $key, OPENSSL_RAW_DATA, $iv))); // 校驗 $user = (new User())->findBy($userID); Session::set('user', $user); return $user->remember_token == $rememberToken; } /** * 加密 * * @return array */ protected function getSecret() { return ['admin_auth', 'AES-128-CBC', '1234567890123412']; } /** * 記住 * * @param $user * @return void */ protected function LoginRemember($user, Request $request) { if ($request->has('remember')) { $rememberToken = $this->secretRememberToken($user->id, $this->generateRememberToken()); $user->remember_token = $rememberToken; Cookie::forever('remember_token', $rememberToken); } $user->login_at = date('Y-m-d h:i:s', time()); $user->login_ip = request()->ip(); $user->save(); } } ``` Auth實現之后登錄就很方便了。 ## login 實現 創建 application\admin\controller\Login.php ``` namespace app\admin\controller; use think\Controller; use app\traits\Auth; class Login extends Controller { use Auth; protected $redirect = 'admin/index/index'; /** * Login Page * * @return mixed */ public function login() { // 登錄邏輯 if ($this->request->isPost()) { $this->authLogin($this->request); } // 記住登錄的話, 直接登錄 if ($this->rememberLogin()) { return redirect($this->redirect); } return $this->fetch('admin/login/login'); } /** * 登出 * * @return \Illuminate\Http\RedirectResponse|\Illuminate\Routing\Redirector|\think\response\Redirect */ public function logout() { $this->authLogout(); return redirect('admin/login/login'); } } ``` ## 頁面效果
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看