• 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/

  • 相关阅读:
    XML验证框架在项目中的应用
    Container.DataItem几种方式.
    XMLSpy 的使用
    介绍一个工具给大家,做网站时,经常要上传文件到外网服务器,但是上传时往往需要很长时间,如果有一个文件对比工具……
    Xcopy 帮助.net 2005组件化开发
    不影响原有的onload方法的前提下,在页面中增加onload的执行方法
    如何将XSD文件以及引入import的文件生成相应的C#类。
    封装my97时间控件成asp.net 时间控件,支持多语言,皮肤,时间大小限制,时间格式验证功能,非常强大。
    参数化使用ADO.NET的OleDb方法时注意不能使用@参数
    提供一个通用的Javascript验证页面输入的脚本给大家,并希望大家提意见呀
  • 原文地址:https://www.cnblogs.com/polax/p/14656132.html
Copyright © 2020-2023  润新知