博客列表 >PHP大牛成长之路:laravel 使用 attempt 登录认证

PHP大牛成长之路:laravel 使用 attempt 登录认证

周Sir-BLOG
周Sir-BLOG原创
2020年09月21日 00:37:152524浏览

laravel 使用attempt登录认证

1、数据库如下:

注意:laravel的自带登录认证attempt默认使用的就是bcrypt函数的加密算法,如果用了别的加密算法会出现匹配不上的就返回了false的情况;所以演示数据库密码是:123456,用来 $aaa = Hash::make("123456") 得到的。

2、控制器( App\Http\Controllers\Admin\admin.php)

  1. namespace App\Http\Controllers\Admin;
  2. use App\Http\Controllers\Controller;
  3. use Illuminate\Http\Request;
  4. use Illuminate\Support\Facades\Auth;
  5. // use Illuminate\Support\Facades\DB;
  6. // use Illuminate\Support\Facades\Hash;
  7. class Admin extends Controller
  8. {
  9. // 管理首页
  10. public function index()
  11. {
  12. return '欢迎进入后台管理系统';
  13. // return View('admin/admin');
  14. }
  15. // 登录界面
  16. public function login()
  17. {
  18. return View('admin/login');
  19. }
  20. // 登录验证
  21. public function chklogin(Request $request)
  22. {
  23. $username = trim($request->username);
  24. $password = trim($request->password);
  25. $verify = trim($request->verify);
  26. // 密码不支持MD5验证,改为明文也不行,最后网上找到方法将密码加密存进数据库
  27. // $aaa = Hash::make("123456");
  28. session_start();
  29. $code = $_SESSION['code'];
  30. if ($verify == '') {
  31. exit(json_encode(['code'=>401,'msg'=>'请输入验证码']));
  32. }
  33. if (strtolower($verify) != strtolower($code)) {
  34. exit(json_encode(['code'=>401,'msg'=>'验证码错误']));
  35. }
  36. if (!Auth::attempt(['username'=>$username,'password'=>$password])) {
  37. exit(json_encode(['code'=>401,'msg'=>'用户名或密码错误']));
  38. };
  39. dump($username, $password, $verify);
  40. // dump($password);
  41. // dump($verify);
  42. }
  43. //获取验证码
  44. public function get_verify()
  45. {
  46. return self::create();
  47. }
  48. }

2.1、基类控制器( app\Http\Controllers\Controller.php)

  1. namespace App\Http\Controllers;
  2. use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
  3. use Illuminate\Foundation\Bus\DispatchesJobs;
  4. use Illuminate\Foundation\Validation\ValidatesRequests;
  5. use Illuminate\Routing\Controller as BaseController;
  6. class Controller extends BaseController
  7. {
  8. use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
  9. // 获取验证码配置
  10. private static function _getCodeConfig()
  11. {
  12. return [
  13. // 验证码字符集
  14. 'codeStr' => 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',
  15. // 验证码个数
  16. 'codeCount' => 4,
  17. // 字体大小
  18. 'fontsize' =>18,
  19. // 验证码的宽度
  20. 'width' => 100,
  21. // 验证码高度
  22. 'height' => 36,
  23. // 是否有干扰点?true有,false没有
  24. 'disturbPoint' => true,
  25. // 干扰点个数,disturbPoint开启后生效
  26. 'pointCount' => 100,
  27. // 是否有干扰条?true有,false没有
  28. 'disturbLine' => true,
  29. // 干扰条个数,disturbLine开启后生效
  30. 'lineCount' => 3
  31. ];
  32. }
  33. // 创建图片验证码
  34. public static function create()
  35. // public static function create()
  36. {
  37. // 配置
  38. $config = self::_getCodeConfig();
  39. //创建画布
  40. $image = imagecreatetruecolor($config['width'], $config['height']);
  41. //背景颜色
  42. $bgcolor=imagecolorallocate($image, 255, 255, 255);
  43. imagefill($image, 0, 0, $bgcolor);
  44. $captch_code = '';//存储验证码
  45. $captchCodeArr = str_split($config['codeStr']);
  46. //随机选取4个候选字符
  47. for ($i=0;$i<$config['codeCount'];$i++) {
  48. $fontsize = $config['fontsize'];
  49. $fontcolor=imagecolorallocate($image, rand(0, 120), rand(0, 120), rand(0, 120));//随机颜色
  50. $fontcontent = $captchCodeArr[rand(0, strlen($config['codeStr'])-1)];
  51. $captch_code.=$fontcontent;
  52. $_x = $config['width']/$config['codeCount'];
  53. $x=($i*(int)$_x)+rand(5, 10); //随机坐标
  54. $y=rand(5, 10);
  55. imagestring($image, $fontsize, $x, $y, $fontcontent, $fontcolor); // 水平地画一行字符串
  56. }
  57. session_start();
  58. $_SESSION['code']=$captch_code;
  59. //增加干扰点
  60. if ($config['disturbPoint']) {
  61. for ($i=0;$i<$config['pointCount'];$i++) {
  62. $pointcolor=imagecolorallocate($image, rand(50, 200), rand(50, 200), rand(50, 200));
  63. imagesetpixel($image, rand(1, 99), rand(1, 29), $pointcolor);
  64. }
  65. }
  66. //增加干扰线
  67. if ($config['disturbLine']) {
  68. for ($i=0;$i<$config['lineCount'];$i++) {
  69. $linecolor=imagecolorallocate($image, rand(80, 280), rand(80, 220), rand(80, 220));
  70. imageline($image, rand(1, 99), rand(1, 29), rand(1, 99), rand(1, 29), $linecolor);
  71. }
  72. }
  73. //输出格式
  74. header('content-type:image/png');
  75. imagepng($image);
  76. //销毁图片
  77. imagedestroy($image);
  78. }
  79. }

3、路由(routes\web.php)

  1. // 登录页面
  2. Route::get('admin/login', 'Admin\Admin@login');
  3. //获取验证码
  4. Route::get('admin/verify', 'Admin\Admin@get_verify');
  5. //登录验证
  6. Route::post('admin/chklogin', 'Admin\Admin@chklogin');
  7. //后台首页
  8. Route::get('admin/', 'Admin\Admin@index');

4、视图(resources\views\admin\login.blade.php)

  1. <!DOCTYPE html>
  2. <html>
  3. <head>
  4. <meta charset="utf-8">
  5. <title>管理员登录 - 后台管理</title>
  6. <meta name="renderer" content="webkit">
  7. <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  8. <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=0">
  9. <script type="text/javascript" src="/static/layui/layui.js"></script>
  10. <link rel="stylesheet" href="/static/layui/css/layui.css">
  11. <link rel="stylesheet" href="/static/style.css">
  12. </head>
  13. <body>
  14. <div class="layadmin-user-login layadmin-user-display-show" id="LAY-user-login" style="display: none;">
  15. <div class="layadmin-user-login-main">
  16. <div class="layadmin-user-login-box layadmin-user-login-header">
  17. <h2>后台管理系统</h2>
  18. </div>
  19. <div class="layadmin-user-login-box layadmin-user-login-body layui-form">
  20. @CSRF
  21. <div class="layui-form-item">
  22. <label class="layadmin-user-login-icon layui-icon layui-icon-username"
  23. for="LAY-user-login-username"></label>
  24. <input type="text" name="username" id="username" lay-verify="required" placeholder="用户名"
  25. class="layui-input">
  26. </div>
  27. <div class="layui-form-item">
  28. <label class="layadmin-user-login-icon layui-icon layui-icon-password"
  29. for="LAY-user-login-password"></label>
  30. <input type="password" name="password" id="password" lay-verify="required" placeholder="密码"
  31. class="layui-input">
  32. </div>
  33. <div class="layui-form-item">
  34. <div class="layui-row">
  35. <div class="layui-col-xs7">
  36. <label class="layadmin-user-login-icon layui-icon layui-icon-vercode"
  37. for="LAY-user-login-vercode"></label>
  38. <input type="text" name="verity" id="verify" placeholder="验证码" class="layui-input" maxlength="4">
  39. </div>
  40. <div class="layui-col-xs5">
  41. <div style="margin-left: 10px;">
  42. <img id="img" class="verifyImg layadmin-user-login-codeimg" id="LAY-user-get-vercode"
  43. onclick="this.src=this.src+'?c='+Math.random();"
  44. src="/admin/verify" />
  45. </div>
  46. </div>
  47. </div>
  48. </div>
  49. <div class="layui-form-item">
  50. <button class="layui-btn layui-btn-fluid layui-bg-blue" onclick="login()" id="login">登录</button>
  51. </div>
  52. </div>
  53. </div>
  54. </div>
  55. <script type="text/javascript">
  56. //加载layer弹窗模块(会自动加载jquery)
  57. layui.use(['layer'], () => {
  58. ly = layui.layer;
  59. $ = layui.jquery;
  60. });
  61. //登录校验
  62. function login() {
  63. let username = $("#username").val();
  64. let password = $("#password").val();
  65. let verify = $("#verify").val();
  66. if(!username || !password){
  67. ly.msg("请输入用户名或者密码!");
  68. return false;
  69. }
  70. if(!verify){
  71. ly.msg("请输入验证码!");
  72. return false;
  73. }
  74. send_ajax();
  75. }
  76. // 提交表单数据
  77. function send_ajax(){
  78. $.ajax({
  79. type: "POST",
  80. url: "/admin/chklogin",
  81. dataType: "json",
  82. data: {
  83. username:$("#username").val(),
  84. password:$("#password").val(),
  85. verify:$('#verify').val(),
  86. _token:$('input[name="_token"]').val()
  87. },
  88. success: function(data){}
  89. });
  90. }
  91. </script>
  92. </body>
  93. </html>

5、User.php(app\User.php)

  1. //指定数据表名称
  2. protected $table = 'admin';
  • 用户名或密码空

  • 验证码错误

  • 登录成功

总结

  • 老师讲课时并没有说密码是以什么方式加密保存的,使用attempt登录认证一直返回错误,大坑啊 ~ 折腾了几个小时 ~

  • 老师提高验证码类我把方法放到了基类控制器中,使用self::create();调用;

  • CSS文件没放了,借用layui admin的例子。

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议