基于 thinkphp5.1 实现的海豚后台登录源码分析

一、 首先来到登录代码处,部分代码截图,大家有兴趣可以自己去看源码

登录处开始

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();

}}

}

进入 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;

}

检查各种权限没有问题后开始登录

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

}

关于 data_auth_sign 加密方法

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);

}

}

海豚php源码,基于 ThinkPHP5.1 实现的海豚后台登录源码分析相关推荐

  1. 前台模板 海豚php_GitHub - cbw1820446/DolphinPHP: 海豚PHP——快速开发框架(基于ThinkPHP5.0.3)...

    DolphinPHP DophinPHP(海豚PHP)是一个基于ThinkPHP5.0.3开发的一套开源PHP快速开发框架,DophinPHP秉承极简.极速.极致的开发理念,为开发集成了基于数据-角色 ...

  2. 七夕节微信表白墙小程序源码/基于Laravel的表白墙微信小程序源码

    七夕节微信表白墙小程序源码/基于Laravel的表白墙微信小程序源码 ☑️ 编号:ym499 ☑️ 品牌:无 ☑️ 语言:小程序 ☑️ 大小:11.2MB ☑️ 类型:微信表白墙小程序 ☑️ 支持:小 ...

  3. php异业联盟平台源码,基于ThinkPHP5.1框架开发的B2C在线商城系统PHP源码

    会员优惠 会员优惠 月费会员8折.年费会员5折.永久会员2折 源码介绍 基于ThinkPHP5.1框架开发的B2C在线商城系统PHP源码,支持WAP手机端+微信小程序+支付宝小程序+多种支付方式! 这 ...

  4. php-人员权限管理源码,基于ThinkPHP5+ACE框架开发的响应式通用后台权限管理系统PHP源码|响应式轻量级企业网站管理系统...

    源码介绍 基于ThinkPHP5+ACE框架开发的响应式通用后台权限管理系统PHP源码是一款响应式轻量级企业网站管理系统,采用ThinkPHP5.0.10+国外ACE1.40的UI模板的后台内容管理框 ...

  5. 赚钱宝 mysql_狂雨小说CMS 1.1.1 最新版源码 基于ThinkPHP5.1+MySQL的开发

    狂雨小说内容管理系统(以下简称KYXSCMS)提供一个轻量级小说网站解决方案,基于ThinkPHP5.1+MySQL的技术开发. KYXSCMS,灵活,方便,人性化设计简单易用是最大的特色,是快速架设 ...

  6. 失物招领网站html源码,基于web的失物招领系统(完整源码+论文全套+教学视频)...

    实现一个web的失物招领系统, 也就是说可以基于浏览器来进行各种数据信息的管理功能, 也可以认为是一个B/S架构的失物招领系统的系统,系统分为前后台,实现了能够进行线上操作, 进行失物招领系统各 ...

  7. 最新版去水印小程序源码/基于WordPress的短视频去水印小程序源码

    最新版去水印小程序源码,基于WordPress的短视频去水印小程序源码.本版本全开源,是Wordpress插件 上传到Wordpress 安装插件,启动之后绑定自己的小程序id就可以了. wordpr ...

  8. [含论文+源码等]微信小程序电影购票+后台管理系统源码

    IT源码 <微信小程序电影购票+后台管理系统>该项目含有源码.论文等资料.配套开发软件.软件安装教程.项目发布教程等 本系统包含微信小程序做的电影购票前台和Java做的后台管理系统: 微信 ...

  9. 七夕节情人节微信表白墙小程序源码/基于Laravel的表白墙微信小程序源码

    简介: 微信表白墙小程源码,表白墙最大的特色就是地域性,圈子性比较强,在地方县城里这种级别就比较合适,在大学里更是如鱼得水. 功能主要分为:表白墙.卖舍友.步数旅行.情侣脸.我的,大致功能都在图上了. ...

最新文章

  1. 数通手稿留档——ISIS
  2. node.js 学习笔记三:路由url
  3. Java网络编程笔记6
  4. python语言实例-Python与其他语言比较实例
  5. 3.放弃CHAR吧,在铸成大错之前!
  6. NET Core微服务之路:自己动手实现Rpc服务框架,基于DotEasy.Rpc服务框架的介绍和集成...
  7. html屏幕垂直居中显示,HTML+CSS,让div在屏幕中居中(水平居中+垂直居中)方法总结...
  8. 万向节死锁_万向节死锁 gimbal lock
  9. org.apache.flink.table.api.bridge.java.internal.BatchTableEnvironmentImpl找不到的问题
  10. html视频位置控制器,html5中返回音视频的当前媒体控制器的属性controller
  11. 使用python和javascript进行数据可视化
  12. 好玩的脚本代码大全_Github | 推荐一个Python脚本集合项目
  13. oracle数组的使用
  14. LeetCode Binary Tree PostorderTranversal
  15. Centos5.8升级SSH到5.8p2
  16. hbase 源代码解析(2)HAdmin 的表创建过程
  17. mysql时间戳转为日期格式_mysql时间戳与日期格式的相互转换
  18. 笔记本电脑开不了机怎么重装系统?小熊U盘重装win7系统教程
  19. win7如何通过电脑系统开启无线热点
  20. 1197 山区建小学

热门文章

  1. C语言详解 - 枚举类型
  2. 机器学习算法原理 (一)机器学习算法汇总
  3. 淘宝/天猫获取购买到的商品订单物流 API接口 代码分享
  4. 算法题 - 文章病句标识 - Python
  5. pb数据窗口一些技取
  6. 线上服务 CPU 100% ?一键定位 so easy!
  7. 7 款印象笔记开源替代
  8. 看我逆向小米rom层应用做碎片化适配
  9. Python负数的整除和取余
  10. 绝地求生大逃杀BE启动失败,应用程序无法正常启动