从 0 搭建用户认证和权限管理
文章目录
用户认证
用户注册
1.新增路由
本项目使用DingoAPI作为路由,未安装请参考并进行安装配置:
添加用户注册路由
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作为用户登陆凭证,如果没有了解过,请参考:
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';