本文将用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、认证及修改生效配置

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

(1)配置修改生效设置

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

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

(2)认证中间件注册

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

 $app->routeMiddleware([
'authToken' => App\Http\Middleware\AuthToken::class,
]);

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

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

 $app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class);

最后,LumenAuth\bootstrap\app.php文件有效代码如下:

 ---------------------------------------
LumenAuth\bootstrap\app.php
---------------------------------------
<?php
require_once __DIR__.'/../vendor/autoload.php';
try {
(new Dotenv\Dotenv(__DIR__.'/../'))->load();
} catch (Dotenv\Exception\InvalidPathException $e) {
//
}
$app = new Laravel\Lumen\Application(
realpath(__DIR__.'/../')
); $app->withFacades();
$app->withEloquent(); $app->singleton(
Illuminate\Contracts\Debug\ExceptionHandler::class,
App\Exceptions\Handler::class
);
$app->singleton(
Illuminate\Contracts\Console\Kernel::class,
App\Console\Kernel::class
); $app->routeMiddleware([
'authToken' => App\Http\Middleware\AuthToken::class,
]); $app->register(App\Providers\AppServiceProvider::class);
$app->register(App\Providers\AuthServiceProvider::class); $app->group(['namespace' => 'App\Http\Controllers'], 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、定义数据表结构

编辑LumenAuth\database\migrations\文件夹下的*_create_users_table.php文件

---------------------------------------
LumenAuth\database\migrations\*_create_users_table.php
---------------------------------------
<?php
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Database\Migrations\Migration; 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、创建用户数据模型

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

 ---------------------------------------
LumenAuth\app\User.php
---------------------------------------
<?php
namespace App;
use Illuminate\Auth\Authenticatable;
use Laravel\Lumen\Auth\Authorizable;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Contracts\Auth\Authenticatable as AuthenticatableContract;
use Illuminate\Contracts\Auth\Access\Authorizable 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
------------------------------------------------------------------

根据上表在LumenAuth\app\Http\routes.php中定义路由:

---------------------------------------
LumenAuth\app\Http\routes.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逻辑

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

 ---------------------------------------
LumenAuth\app\Http\Controllers\Controller.php
---------------------------------------
<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\User;
use Auth;
use Laravel\Lumen\Routing\Controller 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验证才能获取用户信息。在LumenAuth\app\Http\Providers\AuthServiceProvider.php中定义验证服务。我们使用header包含token的形式来验证。修改LumenAuth\app\Http\Providers\AuthServiceProvider.php文件代码。

---------------------------------------
LumenAuth\app\Http\Providers\AuthServiceProvider.php
---------------------------------------
<?php
namespace App\Providers;
use App\User;
use Illuminate\Support\Facades\Gate;
use Illuminate\Support\ServiceProvider; 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();
}
});
}
}
---------------------------------------

九、定义认证中间件

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

---------------------------------------
LumenAuth\app\Http\Middleware\AuthToken.php
---------------------------------------
<?php
namespace App\Http\Middleware;
use Closure;
use Auth;
class AuthToken
{
public function handle($request, Closure $next)
{
if(Auth::check()){
return $next($request);
}else{
abort(401);
}
}
}
---------------------------------------

十、测试使用

1、用户注册

2、用户登录

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

3、获取用户信息

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

lumen 登陆 注册 demo的更多相关文章

  1. ASP.NET中使用Entity Framework开发登陆注册Demo

    这里更多的是当作随身笔记使用,记录一下学到的知识,以便淡忘的时候能快速回顾 当前步骤是该项目的第一部分 第一部分(当前) 第二部分 大完结版本 直接上步骤,有类似的开发登陆注册也可以参考. 登陆注册的 ...

  2. 三篇文章带你极速入门php(三)之php原生实现登陆注册

    看下成果 ps:纯天然h5,绝不添加任何添加剂(css)以及化学成分(js)(<( ̄ ﹌  ̄)我就是喜欢纯天然,不接受任何反驳) 关于本文 用原生的php和html做了一个登陆注册,大概是可以窥 ...

  3. jquery完成界面无刷新加载登陆注册

    昨天公司说官网的登陆注册每次要跳转到另一个界面,能不能做一个简单的,在界面弹出一个框框登陆,我想了想做了这么一个案例,大家来看看成不成 贴上代码,实现了在同一个弹出窗上加载了登陆注册功能!可自由点击! ...

  4. SpringBoot写一个登陆注册功能,和期间走的坑

    文章目录 前言 1. 首先介绍项目的相关技术和工具: 2. 首先创建项目 3. 项目的结构 3.1实体类: 3.2 Mapper.xml 3.3 mapper.inteface 3.4 Service ...

  5. Android通过Http连接MySQL 实现登陆/注册(数据库+服务器+客户端)

    写在最前: 在实际开发中,相信每个项目都会有用户登陆注册功能,这个实现的方法很多,下面是我实现的方法,供大家交流. 新人发帖,万分紧张,怎么样才能装作一副经常发帖的样子不被别人看出来呢-,- ? 好了 ...

  6. java 24 - 11 GUI之制作登陆注册页面

    简单说说,懒得发了... 步骤: A:首先写出登陆注册需要用到类以及代码(IO流) B:然后创建登陆窗口和注册窗口 C:各个监听事件: a:登录窗口 1.重置:把2个文本框的内容全部清空 2.注册:关 ...

  7. 无废话ExtJs 入门教程七[登陆窗体Demo:Login]

    无废话ExtJs 入门教程七[登陆窗体Demo:Login] extjs技术交流,欢迎加群(201926085) 在这节我们通过前几节讲的内容做一个登陆页面,把前几节讲的内容贯穿一下. 1.代码如下: ...

  8. PHP数据库登陆注册简单做法

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. javaweb 登陆注册页面

    视图的数据修改,表中也修改引用工具类用<%@ page import=""%> <%@ page import="java.util.Date" ...

随机推荐

  1. 支持向量机(SVM)算法

  2. HBase Cassandra Riak HyperTable

    Cassandra                                                              HBase 一致性 Quorum NRW策略 通过Goss ...

  3. BZOJ2733 [HNOI2012]永无乡

    直接平衡树启发式合并就好了...貌似是个很高端的东西.. 貌似可以证明splay的启发式合并是均摊$O(nlogn)$的...而其他平衡树都不行,所以其他的复杂度都是$O(nlog^2n)的$的 所以 ...

  4. UOJ Test Round 1

    第一题: 题目大意: 给出N个字符串,字符串的前面部分都是字母且都是一样的,后面部分是数字,按照后面的数字排序.N<=10000 解题过程: 1.第一题是真良心,一开始的做法是把后面的数字分离出 ...

  5. hehe

    with wares as        (         SELECT distinct a.Wid as wid,         a.Wname as wareName,         a. ...

  6. zlhome.com Deal

    using AnfleCrawler.Common; using System; using System.Collections.Generic; using System.Linq; using ...

  7. <input type="file">中怎设置那个按钮的样式

    最近才开始学习HTML,在练习表单的过程中,发现在使用<input type="file"/>这个类型的元素,产生的文件框和浏览按扭,它们的样式往往不符合我们的需要.怎 ...

  8. Linq二 LinqToSql

    虽然微软已经停止更新了LinqToSql,但是目前的已完全满足目前的需求. 第一步:添加LinqToSql 第二步:将其关联的Sqlserver数据库 第三步:数据库已变成实体类 第四步:可以对数据库 ...

  9. HDU 4507 吉哥系列故事——恨7不成妻

    需要推下平方和的式子..维护个数,和,平方和. #include<iostream> #include<cstdio> #include<cstring> #inc ...

  10. rpm软件包管理

    RPM 有五种基本的操作方式(不包括创建软件包): 安装, 卸载, 升级, 查询,和验证. 下面我们就来逐一的讲解吧. 一. 安装RPM包 RPM 软件包通常具有类似foo-1.0-1.i386.rp ...