zoukankan      html  css  js  c++  java
  • lumen 登陆 注册 demo

    本文将用Lumen来实现一个完整的用户注册、登录及获取用户信息的API。

    Lumen环境搭建和初始化详细步骤请参考上篇文章《Lumen安装配置使用入门》一文。

    一、准备工作

    1、Lumen环境搭建

    可参考上篇文章《Lumen安装配置使用入门》一文。

    2、数据库信息

    数据库地址:localhost

    数据库名称:lumenauth

    数据库用户:root

    数据库密码:******

    二、初始化Lumen

    lumen new LumenAuth

    三、配置

    1、数据库配置

    在命令行进入项目所在文件夹,执行命令:

    copy .env.example .env

    用文本编辑器打开.env文件,根据之前准备的数据库信息作相应修改。

    ---------------------------------------
     LumenAuth.env
     ---------------------------------------
     APP_ENV=local
     APP_DEBUG=true
     APP_KEY=
     DB_CONNECTION=mysql
     DB_HOST=localhost
     DB_PORT=3306
     DB_DATABASE=lumenauth
     DB_USERNAME=root
     DB_PASSWORD=
     CACHE_DRIVER=memcached
     QUEUE_DRIVER=sync
     ---------------------------------------
    

    2、认证及修改生效配置

    打开项目文件夹LumenAuthootstrapapp.php文件,我们将在这里作几处修改。

    (1)配置修改生效设置

    首先,把以下两行代码取消注释,让数据库信息和认证服务修改可以生效。

     $app->withFacades();
     $app->withEloquent();

    (2)认证中间件注册

    参照LumenAuthootstrapapp.php文件中”Register Middleware” 部分的中间件注册代码,在它下面注册一个认证路由中间件,这个路由中间件需要我们后面在LumenAuthappHttpMiddleware文件夹中自定义,我们这里先做配置,后面进行代码实现。注册中间件使用以下代码:

     $app->routeMiddleware([
       'authToken' => AppHttpMiddlewareAuthToken::class,
     ]);

    (3)开启注册服务提供者

    认证中间件的生效还需要注册服务提供者支持,在LumenAuthootstrapapp.php文件下面把以下两行代码的注释去掉即可开启注册服务提供者:

     $app->register(AppProvidersAppServiceProvider::class);
     $app->register(AppProvidersAuthServiceProvider::class);
    

    最后,LumenAuthootstrapapp.php文件有效代码如下:

     ---------------------------------------
     LumenAuthootstrapapp.php
     ---------------------------------------
     <?php
       require_once __DIR__.'/../vendor/autoload.php';
       try {
         (new DotenvDotenv(__DIR__.'/../'))->load();
         } catch (DotenvExceptionInvalidPathException $e) {
           //
         }
       $app = new LaravelLumenApplication(
         realpath(__DIR__.'/../')
       );
    
       $app->withFacades();
       $app->withEloquent();
    
       $app->singleton(
         IlluminateContractsDebugExceptionHandler::class,
         AppExceptionsHandler::class
       );
       $app->singleton(
         IlluminateContractsConsoleKernel::class,
         AppConsoleKernel::class
       );
    
       $app->routeMiddleware([
         'authToken' => AppHttpMiddlewareAuthToken::class,
       ]);
    
       $app->register(AppProvidersAppServiceProvider::class);
       $app->register(AppProvidersAuthServiceProvider::class);
    
       $app->group(['namespace' => 'AppHttpControllers'], function ($app) {
         require __DIR__.'/../app/Http/routes.php';
       });
       return $app;
     ---------------------------------------

    四、用户登录认证案例需求及逻辑

    本来这部分应该放在第一部分,但是由于这部分与下面几部分关系比较紧密,因此放在这里一起。

    这个案例要实现用户注册、登录和获取用户信息三个功能。

    1、用户注册

    后端接收用户附加用户信息(用户名、用户密码和邮箱)的请求后:

    (1)判断信息是否完整,如信息完整则进行下一步写入数据库阶段,如果信息完整并成功写入数据库,则返回“用户注册成功!”信息,否则返回“用户注册失败!”;

    (2)如果信息不完整,不用操作数据库,直接返回“请输入完整用户信息!”提示信息。

    (3)用户密码处理:使用sha1加密方式并附加一个随机自定义字符。

    2、用户登录

    (1)把用户登录和用户信息请求分开,用户登录功能只是为了获取一个可以请求获取用户信息的Token,而且每次用户登录成功后都会随机改变Token值并更新数据库中的Token。

    (2)如果要获取用户信息,需要根据登录成功后返回的Token另外单独请求专门获取用户信息的API,核对Token值与数据库保存的Token值后返回结果。

    (3)用户登录成功后返回用户最新Token;登录失败返回“用户名或密码不正确,登录失败!”;登录信息不完整返回“登录信息不完整,请输入用户名和密码登录!”。

    3、获取用户信息

    (1)根据用户Token验证返回用户信息;

    (2)使用Header包含Token形式附带Token;

    五、数据库模型及数据表建立

    1、建立数据模型

    通过以上分析,可以建立基本的数据模型,这里只要用一张用户表格就行了,用户表结构如下:

    -------------------------------------------------
      字段         |  类型          |  其它
     -------------------------------------------------
      id           |  int(10)      |  AUTO_INCREMENT
     -------------------------------------------------
      username     |  varchar(255) |
     -------------------------------------------------
      password     |  varchar(255) |
     -------------------------------------------------
      email        |  varchar(255) |
     -------------------------------------------------
      api_token    |  varchar(60)  |  UNIQUE
     -------------------------------------------------
      created_at   |  timestamp    |
     -------------------------------------------------
      updated_at   |  timestamp    |
     -------------------------------------------------
    

    2、创建用户数据模式迁移

    php artisan make:migration create_users_table --create=users

    3、定义数据表结构

    编辑LumenAuthdatabasemigrations文件夹下的*_create_users_table.php文件

    ---------------------------------------
     LumenAuthdatabasemigrations*_create_users_table.php
     ---------------------------------------
     <?php
     use IlluminateDatabaseSchemaBlueprint;
     use IlluminateDatabaseMigrationsMigration;
    
     class CreateUsersTable extends Migration
     {
       public function up()
       {
         Schema::create('users', function (Blueprint $table) {
         $table->increments('id');
         $table->string('username');
         $table->string('password');
         $table->string('email');
         $table->string('api_token', 60)->unique();
         $table->timestamps();
       });
     }
    
       public function down()
       {
         Schema::drop('users');
       }
     }
     ---------------------------------------

    4、创建用户数据模型

    如果你的项目文件夹LumenAuthapp文件夹下没有User.php文件,那么新建一个User.php文件,文件内容如下:

     ---------------------------------------
     LumenAuthappUser.php
     ---------------------------------------
     <?php
     namespace App;
     use IlluminateAuthAuthenticatable;
     use LaravelLumenAuthAuthorizable;
     use IlluminateDatabaseEloquentModel;
     use IlluminateContractsAuthAuthenticatable as AuthenticatableContract;
     use IlluminateContractsAuthAccessAuthorizable as AuthorizableContract;
    
     class User extends Model implements
       AuthenticatableContract,
       AuthorizableContract
     {
       use Authenticatable, Authorizable;
    
       protected $fillable = ['name', 'email', 'api_token'];
    
       protected $hidden = ['password'];
     }
     ---------------------------------------

    六、路由定义

    定义下面三个路由,用于实现用户注册、登录及获取用户信息。

     ------------------------------------------------------------------
       序号 | 路由类型 |   路由路径      | 路由控制器
     ------------------------------------------------------------------
       1    |   POST  | users/login    | UserController@login
     ------------------------------------------------------------------
       2    |   POST  | users/register | UserController@register
     ------------------------------------------------------------------
       3    |   GET   | users/info     | UserController@info
     ------------------------------------------------------------------

    根据上表在LumenAuthappHttp outes.php中定义路由:

    ---------------------------------------
     LumenAuthappHttp
    outes.php
     ---------------------------------------
     <?php
       $app->get('/', function () use ($app) {
         return $app->version();
       });
       $app->post('users/login', 'UserController@login');
       $app->post('users/register', 'UserController@register');
       $app->get('users/info', [
         'middleware' => 'authToken',
         'uses' => 'UserController@info'
       ]);
     ---------------------------------------

    七、Controller逻辑

    在LumenAuthappHttpControllers文件夹下新建用户控制器UserController.php,实现用户注册、登录和用户信息获取功能。

     ---------------------------------------
     LumenAuthappHttpControllersController.php
     ---------------------------------------
     <?php
     namespace AppHttpControllers;
     use IlluminateHttpRequest;
     use AppUser;
     use Auth;
     use LaravelLumenRoutingController as BaseController;
    
     class UserController extends Controller
     {
       private $salt;
       public function __construct()
       {
         $this->salt="userloginregister";
       }
    
       public function login(Request $request){
       if ($request->has('username') && $request->has('password')) {
           $user = User:: where("username", "=", $request->input('username'))
           ->where("password", "=", sha1($this->salt.$request->input('password')))
           ->first();
    
         if ($user) {
           $token=str_random(60);
           $user->api_token=$token;
           $user->save();
           return $user->api_token;
         } else {
           return "用户名或密码不正确,登录失败!";
         }
       } else {
         return "登录信息不完整,请输入用户名和密码登录!";
       }
     }
    
     public function register(Request $request){
     if ($request->has('username') && $request->has('password') && $request->has('email')) {
       $user = new User;
       $user->username=$request->input('username');
       $user->password=sha1($this->salt.$request->input('password'));
       $user->email=$request->input('email');
       $user->api_token=str_random(60);
       if($user->save()){
         return "用户注册成功!";
       } else {
         return "用户注册失败!";
       }
     } else {
       return "请输入完整用户信息!";
     }
     }
    
     public function info(){
       return Auth::user();
     }
     }
     ---------------------------------------
    

    八、认证服务

    必须要通过token验证才能获取用户信息。在LumenAuthappHttpProvidersAuthServiceProvider.php中定义验证服务。我们使用header包含token的形式来验证。修改LumenAuthappHttpProvidersAuthServiceProvider.php文件代码。

    ---------------------------------------
     LumenAuthappHttpProvidersAuthServiceProvider.php
     ---------------------------------------
     <?php
     namespace AppProviders;
     use AppUser;
     use IlluminateSupportFacadesGate;
     use IlluminateSupportServiceProvider;
    
     class AuthServiceProvider extends ServiceProvider
     {
       public function register()
       {
        //
       }
    
       public function boot()
       {
         $this->app['auth']->viaRequest('api', function ($request) {
         if ($request->header('api_token')) {
           return User:: where('api_token', '=', $request->header('api_token'))->first();
         }
         });
       }
     }
     ---------------------------------------
    

    九、定义认证中间件

    在LumenAuthappHttpMiddleware文件夹下定义认证路由中间件AuthToken.php,就是之前在路由中定义的”authToken”。

    ---------------------------------------
    LumenAuthappHttpMiddlewareAuthToken.php
    ---------------------------------------
    <?php
    namespace AppHttpMiddleware;
    use Closure;
    use Auth;
    class AuthToken
    {
     public function handle($request, Closure $next)
     {
     if(Auth::check()){
       return $next($request);
     }else{
       abort(401);
     }
     }
    }
    ---------------------------------------

    十、测试使用

    1、用户注册

    register_success

     

    2、用户登录

    login_success

    login_token

    用户登录成功后,数据库的api_token也会进行更新。

    3、获取用户信息

    user_info

    完整源码:https://github.com/yaoyonstudio/Lumen-User-Login-Register.git

  • 相关阅读:
    中断
    按键
    uart stdio的移植1
    串口通信实战
    串口通信相关知识详解
    SOC时钟
    arm-linux-ld: cannot find sdram_init.o
    SDRAM初始化
    代码重定位实战
    s5pv210的启动过程
  • 原文地址:https://www.cnblogs.com/duanweishi/p/6151721.html
Copyright © 2011-2022 走看看