基于Laravel 从 0 搭建用户认证和权限管理

从 0 搭建用户认证和权限管理

用户认证

用户注册

1.新增路由

本项目使用DingoAPI作为路由,未安装请参考并进行安装配置:

https://learnku.com/docs/dingo-api/2.0.0

添加用户注册路由

routes/api.php

.
.
.
$api->version('v1', [
    "prefix"     => "api",
    'namespace'  => 'App\Http\Controllers\Api',
], function (routesr $api) {
   
        // 用户注册
        $api->post('users', 'UsersController@store')
            ->name('api.users.store');
.
.
.

2.创建请求类和控制器类

php artisan make:controller Api/UsersController
php artisan make:request Api/UserRequest

修改文件

app/Http/Controllers/UsersController.php

.
.
.
class UsersController extends Controller
{
   
    use ApiTraits;
    public function store(UserRequest $request)
    {
   

        $user = User::create([
            'name' => $request->username,
            'password' => bcrypt($request->password),
        ]);

        return $this->apiReturn($user,CodeEnum::INC_SUCCESS);
    }
}

app/Http/Requests/Api/Request.php

<?php

namespace App\Http\Requests\Api;

use Dingo\Api\Http\FormRequest;

class UserRequest extends FormRequest
{
   
    public function authorize()
    {
   
        return true;
    }

    public function rules()
    {
   
        return [
            'name' => 'required|between:3,25|regex:/^[A-Za-z0-9\-\_]+$/|unique:users,name',
            'password' => 'required|string|min:5',
        ];
    }
    public function messages()
    {
   
        return [
            'username.required'             => '用户名 必须',
            'username.between'              => '用户名 长度过短或过长',
            'name.regex'                    => '用户名 只支持英文,数字,横杆和下划线',
            'username.unique'               => '用户名 已存在',
            'password.required'             => '密码 必须',
            'password.min'                  => '密码 长度最小为5',
        ];
    }
}

其中引用Trait类-ApiTraits,统一接口返回

CodeEnum统一存放枚举值

app/Traits/ApiTraits.php

<?php

namespace App\Traits;

/**
 * Trait ApiTraits:api处理
 * @package App\Traits
 * @author zhaodayuan
 * @date 2020/2/3
 */
Trait ApiTraits
{
   
    public function apiReturn($data = [], $codeEnum)
    {
   
        return [
            'status'    => (int) $codeEnum[0],
            'message'   => (string) $codeEnum[1],
            'data' => $data
        ];
    }

}

app/Enum/CodeEnum.php

<?php


namespace App\Enum;

/**
 * 响应码表
 * 所有接口在使用务必在此定义
 * 将所有的响应码中心化,同时也便于查询
 * Class CodeEnum
 * @package App\Enums
 */
class CodeEnum
{
   
    const SUCCESS               = [200, '操作成功'];
    const INC_SUCCESS           = [201, '新增成功'];
    const FAIL                  = [999, '操作失败'];
    const NON_EXISTENT          = [500, '信息不存在'];
    const DATA_EMPTY            = [998, '信息为空'];
    const PARAMS_MISS           = [997, '参数缺失'];
    const ERR_NAME_OR_PASSWORD  = [996, '用户名或密码错误'];
    const NOT_PERMISSION        = [401, '权限不足'];
}

3.Postman运行结果

在这里插入图片描述

用户登陆

本项目使用JWT作为用户登陆凭证,如果没有了解过,请参考:

https://www.cnblogs.com/skaarl/p/9508628.html

1.安装JWT

首先来安装一下,Laravel 5.5 的适配版本为 1.0.0-rc.2

composer require tymon/jwt-auth:1.0.0-rc.2

安装完成后,我们需要设置一下 JWT 的 secret,这个 secret 很重要,用于最后的签名,更换这个 secret 会导致之前生成的所有 token 无效。

php artisan jwt:secret

可以看到在 .env 文件中,增加了一行 JWT_SECRET

修改 config/auth.php,将 api guard 的 driver 改为 jwt

config/auth.php

.
.
.
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
    ],

    'api' => [
        'driver' => 'jwt',
        'provider' => 'users',
    ],
],
.
.
.

修改 config/api.php,auth 中增加 JWT 相关的配置

config/api.php

.
.
.
'auth' => [
    'jwt' => 'Dingo\Api\Auth\Provider\JWT',
],
.
.
.

user 模型需要继承 Tymon\JWTAuth\Contracts\JWTSubject 接口,并实现接口的两个方法 getJWTIdentifier () 和 getJWTCustomClaims ()

app\Model\User.php

<?php

namespace App\Model;

use Tymon\JWTAuth\Contracts\JWTSubject;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable implements JWTSubject
{
   
    protected $table = 'users';

    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值