


Analyse du code source de connexion en arrière-plan Dolphin basée sur ThinkPHP5.1
Analyse du code source de connexion en arrière-plan Dolphin basée sur thinkphp5.1
1 Venons-en d'abord au code de connexion, quelques captures d'écran du code, si vous êtes intéressé, vous pouvez vérifier le code source. vous-même
Démarrez à la connexion
public function signin() { if ($this->request->isPost()) { // 获取post数据 $data = $this->request->post(); $rememberme = isset($data['remember-me']) ? true : false; // 登录钩子, 做一些登录前动作, 这里暂时没有实现 $hook_result = Hook::listen('signin', $data); if (!empty($hook_result) && true !== $hook_result[0]) { $this->error($hook_result[0]); } // 验证数据 $result = $this->validate($data, 'User.signin'); if(true !== $result){ // 验证失败 输出错误信息 $this->error($result); } // 验证码 if (config('captcha_signin')) { $captcha = $this->request->post('captcha', ''); $captcha == '' && $this->error('请输入验证码'); if(!captcha_check($captcha, '')){ //验证失败 $this->error('验证码错误或失效'); }; } // 登录 $UserModel = new UserModel模型分析; // 进去模型逻辑 $uid = $UserModel->login($data['username'], $data['password'], $rememberme); if ($uid) { // 记录行为 action_log('user_signin', 'admin_user', $uid, $uid); $this->jumpUrl(); } else { $this->error($UserModel->getError()); } } else { // 下面是单点登录的钩子,目前后台不支持 $hook_result = Hook::listen('signin_sso'); if (!empty($hook_result) && true !== $hook_result[0]) { if (isset($hook_result[0]['url'])) { $this->redirect($hook_result[0]['url']); } if (isset($hook_result[0]['error'])) { $this->error($hook_result[0]['error']); } } if (is_signin()) { $this->jumpUrl(); } else { return $this->fetch(); }} }
Entrez l'analyse du modèle UserModel
$UserModel = new UserModel; // 调用模型中的Login登录, 账号 密码 是否记住我 $uid = $UserModel->login($data['username'], $data['password'], $rememberme); public function login($username = '', $password = '', $rememberme = false)\ { $username = trim($username); $password = trim($password); // 匹配登录方式 if (preg_match("/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/", $username)) { // 邮箱登录 $map['email'] = $username; } elseif (preg_match("/^1\d{10}$/", $username)) { // 手机号登录 $map['mobile'] = $username; } else { // 用户名登录 $map['username'] = $username; } $map['status'] = 1; // 查找用户 $user = $this::get($map); if (!$user) { $this->error = '用户不存在或被禁用!'; } else { // 检查是否分配用户组 if ($user['role'] == 0) { $this->error = '禁止访问,原因:未分配角色!'; return false; } // 检查是可登录后台 if (!RoleModel::where(['id' => $user['role'], 'status' => 1])->value('access')) { $this->error = '禁止访问,用户所在角色未启用或禁止访问后台!'; return false; } if (!Hash::check((string)$password, $user['password'])) { $this->error = '账号或者密码错误!'; } else { $uid = $user['id']; // 更新登录信息 $user['last_login_time'] = request()->time(); $user['last_login_ip'] = request()->ip(1); if ($user->save()) { // 自动登录 return $this->autoLogin($this::get($uid), $rememberme); } else { // 更新登录信息失败 $this->error = '登录信息更新失败,请重新登录!'; return false; } } } return false; }
Vérifiez diverses autorisations et commencez à vous connecter s'il n'y a pas de problèmes
public function autoLogin($user, $rememberme = false) { // 记录登录SESSION和COOKIES $auth = array( 'uid' => $user->id, 'group' => $user->group, 'role' => $user->role, 'role_name' => Db::name('admin_role')->where('id', $user->role)->value('name'), 'avatar' => $user->avatar, 'username' => $user->username, 'nickname' => $user->nickname, 'last_login_time' => $user->last_login_time, 'last_login_ip' => get_client_ip(1), ); session('user_auth', $auth); // 默认保存session session('user_auth_sign', data_auth_sign($auth)); //参数进行加密 // 保存用户节点权限, 方面后期直接用 if ($user->role != 1) { $menu_auth = Db::name('admin_role')->where('id', session('user_auth.role'))->value('menu_auth'); $menu_auth = json_decode($menu_auth, true); if (!$menu_auth) { session('user_auth', null); session('user_auth_sign', null); $this->error = '未分配任何节点权限!'; return false; } } // 记住登录 if ($rememberme) { // 存储的cookie data_auth_sign 对signin 进行加密 $signin_token = $user->username.$user->id.$user->last_login_time; cookie('uid', $user->id, 24 * 3600 * 7); cookie('signin_token', data_auth_sign($signin_token), 24 * 3600 * 7); } return $user->id; //登录成功返回uid }
À propos du cryptage data_auth_sign méthode
function data_auth_sign($data = []) { // 数据类型检测 if(!is_array($data)){ $data = (array)$data; } // 排序 ksort($data); // url编码并生成query字符串 $code = http_build_query($data); // 生成签名 $sign = sha1($code); return $sign; } 登录后进行登录行为记录,大家可以根据自己需求选择是否记录 最后进行登陆后跳转,分析用户可以跳转的 url private function jumpUrl() { if (session('user_auth.role') == 1) { // 判断是否管理员 $this->success('登录成功', url('admin/index/index')); } // 是否有指定默认跳转模块 $default_module = RoleModel::where('id', session('user_auth.role'))->value('default_module'); $menu = MenuModel::get($default_module); if (!$menu) { $this->error('当前角色未指定默认跳转模块!'); } if ($menu['url_type'] == 'link') { $this->success('登录成功', $menu['url_value']); } $menu_url = explode('/', $menu['url_value']); role_auth(); $url = action('admin/ajax/getSidebarMenu', ['module_id' => $default_module, 'module' => $menu['module'], 'controller' => $menu_url[1]]); if ($url == '') { $this->error('权限不足'); } else { $this->success('登录成功', $url); } }
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Outils d'IA chauds

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Undress AI Tool
Images de déshabillage gratuites

Clothoff.io
Dissolvant de vêtements AI

Video Face Swap
Échangez les visages dans n'importe quelle vidéo sans effort grâce à notre outil d'échange de visage AI entièrement gratuit !

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Sujets chauds



