zoukankan      html  css  js  c++  java
  • Laravel 7 用户认证 Auth —— 1 传统web认证

    1 默认auth登录快速创建

    1.1 数据表的建立

    .env
    DB_CONNECTION=mysql
    DB_HOST=127.0.0.1
    DB_PORT=3306
    DB_DATABASE=homestead
    DB_USERNAME=root
    DB_PASSWORD=123456
    View Code

    创建表

    php artisan migrate

    1.2 安装前端脚手架

    // 生成基本脚手架...
    php artisan ui bootstrap
    php artisan ui vue
    php artisan ui react
    
    // 生成 登陆/注册 脚手架...
    php artisan ui bootstrap --auth
    php artisan ui vue --auth
    php artisan ui react --auth

    1.3 我用vue 所以还要编译

    npm install
    npm run dev

    需先升级nodejs版本到 v12.14 (windows版升级流程 与linux版升级方法不同

    看到这个页面说明成功了

    1.4 定义路由

    appProvidersRouteServiceProvider.php

     public const HOME = '/home';

    2 使用

    2.1 基础操作 获取登录后的基础信息

    <?php
    
    namespace AppHttpControllers;
    
    //use DingoApiAuthAuth;
    use IlluminateHttpRequest;
    use IlluminateSupportFacadesAuth;
    
    class HomeController extends Controller
    {
        /**
         * Create a new controller instance.
         *
         * @return void
         */
        public function __construct()
        {
            $this->middleware('auth');
        }
    
        /**
         * Show the application dashboard.
         *
         * @return IlluminateContractsSupportRenderable
         */
        public function index()
        {
            //判断当前用户是未登录,
            //登录情况下返回true
            Auth::check();
            // 判断当前用户是未登录 ,与 check() 相反
            //登录情况下返回false
            Auth::guest();
            //当前看守器 在configauth.php里配置
            //IlluminateAuthSessionGuard  对象
            Auth::guard();
            //获取当前的认证用户
            //AppUser对象 未登录返回null
            $user = Auth::user();
            if($user){
                Auth::user()->name;     //未登录情况下报错
                Auth::user()->id;       //未登录情况下报错
                Auth::user()->password; //未登录情况下报错
                Auth::user()->remember_token; //未登录情况下报错
                Auth::user()->created_at;//未登录情况下报错
                Auth::user()->updated_at;//未登录情况下报错
                Auth::id(); //获取当前的认证用户的id (未登录情况下会报错)
                
            }
            //手动登录,第二个参数true就是记住我
            Auth::attempt([
                'email'=>$email,
                'password'=>$password
            ],true);
            //登录一个指定的用户到应用上
            Auth::login(User::find(1),$remember=false);
            //退出当前登录用户
            Auth::logout();
            return view('home');
        }
    }
    View Code

     2.2 修改跳转地址

    appHttpControllersAuthLoginController.php

    appHttpControllersAuthRegisterController.php

    appHttpControllersAuthResetPasswordController.php

    appHttpControllersAuthConfirmPasswordController.php

    appHttpControllersAuthVerificationController.php

        /**
         * Where to redirect users after login.
         *
         * @var string
         */
        //方式一:用属性跳转
        //默认跳转到home
        //protected $redirectTo = RouteServiceProvider::HOME;
        //跳转到/
        protected $redirectTo = '/';
        
        //方式二:用方法跳转
        //方法的优先级高于属性定义
        protected function redirectTo()
        {
            //return '/home';     //方式2.1
            return route('home');  //方式2.2
        }
    View Code

     2.3 修改认证字段

    外国人喜欢用email登录,中国人用username

    修改 esourcesviewsauthlogin.blade.php

      {{--<label for="email" class="col-md-4 col-form-label text-md-right">{{ __('E-Mail Address') }}</label>--}}
                                <label for="name" class="col-md-4 col-form-label text-md-right">{{ __('用户名') }} </label>
    
                                <div class="col-md-6">
                                    {{--<input id="email" type="email" class="form-control @error('email') is-invalid @enderror" name="email" value="{{ old('email') }}" required autocomplete="email" autofocus>--}}
                                    <input id="name" type="text" class="form-control @error('name') is-invalid @enderror" name="name" value="{{ old('name') }}" required autocomplete="name" autofocus>
    View Code

    方式一(不推荐):

    appHttpControllersAuthLoginController.php

    添加

        //修改认证字段
        public  function username()
        {
            return 'name';
        }
    View Code

    方式二(推荐):

    appTraitsAuthenticatesUsers.php

    <?php
    /**
     * Created by PhpStorm.
     * User: SUN
     * Date: 2021/4/20
     * Time: 2:24
     */
    
    namespace AppTraits;
    
    use IlluminateFoundationAuthAuthenticatesUsers as LaravelAuthenticatesUsers;
    
    trait AuthenticatesUsers{
        use  LaravelAuthenticatesUsers;
        public function username()
        {
            return 'name';
        }
    }
    View Code

    appHttpControllersAuthLoginController.php 修改

    //use IlluminateFoundationAuthAuthenticatesUsers;
    use AppTraitsAuthenticatesUsers;
    View Code

     2.4 用中间件添加认证

    登录时才能访问,否则会跳到登录页面

    方式一:写在路由里routesweb.php

    Route::get('/profile',function (){
        return '111';
    })->middleware('auth');
    View Code

    方式二:写在控制器里appHttpControllersStudentController.php

     这个控制器里所有的方法都需要经过认证

     //这个控制器里所有的方法都需要经过认证
        public function __construct()
        {
            $this->middleware('auth');
        }
    View Code
    这个控制器里所有的方法都需要经过认证,除了create
     //这个控制器里所有的方法都需要经过认证,除了create
        public function __construct()
        {
            $this->middleware('auth')->except('create');
        }
    View Code

    这个控制器里create 、delete的方法都需要经过认证

    //这个控制器里create 、delete的方法都需要经过认证
        public function __construct()
        {
            $this->middleware('auth')->only(['create','delete']);
        }
    View Code

    2.5 无登录页面,利用弹窗请求认证用户

     使用auth.basic中间件

    Route::get('/profile',function (Request $request){
        return '111';
    })->middleware('auth.basic');
    View Code

    修改 验证字段vendorlaravelframeworksrcIlluminateAuthMiddlewareAuthenticateWithBasicAuth.php

        public function handle($request, Closure $next, $guard = null, $field = null)
        {
            //$this->auth->guard($guard)->basic($field ?: 'email');
            $this->auth->guard($guard)->basic($field ?: 'name');
            return $next($request);
        }
    View Code

    2.6 单设备登录

    如果在火狐登录了,Chrome就会退出

    vendorlaravelframeworksrcIlluminateAuthMiddlewareAuthenticateWithBasicAuth.php

    这行注释打开

     //IlluminateSessionMiddlewareAuthenticateSession::class,
     IlluminateSessionMiddlewareAuthenticateSession::class,

    修改authenticated方法

    IlluminateFoundationAuthAuthenticatesUsers

    protected function authenticated(Request $request, $user)
    {
        $this->guard()->logoutOtherDevices($request->password);
        return response()->json(['message' => '登录成功']);
    }
    View Code

    3 其他认证

    Laravel 7 用户认证 Auth ——内置的API认证
    Laravel 7 用户认证 Auth ——Passport密码模式认证
    Laravel 7 用户认证 Auth ——Passport授权码模式认证

    4 参考资料

    https://www.qianjinyike.com/laravel-%e5%86%85%e7%bd%ae-web-%e8%ae%a4%e8%af%81/

  • 相关阅读:
    rest framework 认证 权限 频率
    rest framework 视图,路由
    rest framework 序列化
    10.3 Vue 路由系统
    10.4 Vue 父子传值
    10.2 Vue 环境安装
    10.1 ES6 的新增特性以及简单语法
    Django 跨域请求处理
    20190827 On Java8 第十四章 流式编程
    20190825 On Java8 第十三章 函数式编程
  • 原文地址:https://www.cnblogs.com/polax/p/14656132.html
Copyright © 2011-2022 走看看