代码功能更新
This commit is contained in:
Executable
+31
@@ -0,0 +1,31 @@
|
||||
<?php
|
||||
|
||||
namespace app\middleware;
|
||||
|
||||
use laytp\BaseMiddleware;
|
||||
use think\Request;
|
||||
|
||||
/**
|
||||
* 允许跨域中间件
|
||||
* Class Auth
|
||||
* @package app\middleware
|
||||
*/
|
||||
class AllowCrossDomain extends BaseMiddleware
|
||||
{
|
||||
/**
|
||||
* 执行中间件
|
||||
* @param Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle($request, \Closure $next)
|
||||
{
|
||||
$header = [
|
||||
'Access-Control-Allow-Origin' => '*',
|
||||
'Access-Control-Allow-Methods' => 'GET, POST, PATCH, PUT, DELETE, OPTIONS',
|
||||
'Access-Control-Allow-Headers' => '*',
|
||||
];
|
||||
|
||||
return $next($request)->header($header);
|
||||
}
|
||||
}
|
||||
Executable
+69
@@ -0,0 +1,69 @@
|
||||
<?php
|
||||
/**
|
||||
* 后台操作日志中间件
|
||||
*/
|
||||
namespace app\middleware\admin;
|
||||
|
||||
use app\model\admin\action\Log;
|
||||
use laytp\BaseMiddleware;
|
||||
use app\model\admin\Menu;
|
||||
use app\service\admin\UserServiceFacade;
|
||||
use think\Request;
|
||||
|
||||
class ActionLog extends BaseMiddleware
|
||||
{
|
||||
/**
|
||||
* 执行中间件
|
||||
* @param Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
* @throws \think\db\exception\DataNotFoundException
|
||||
* @throws \think\db\exception\DbException
|
||||
* @throws \think\db\exception\ModelNotFoundException
|
||||
*/
|
||||
public function handle(Request $request, \Closure $next)
|
||||
{
|
||||
$initUser = UserServiceFacade::init($request->header('laytp-admin-token', $request->cookie('laytpAdminToken')));
|
||||
if (!$initUser || $request->isGet()) return $next($request);
|
||||
|
||||
$requestBody = $request->post();
|
||||
//日志不记录密码
|
||||
if (isset($requestBody['password'])) {
|
||||
$requestBody['password'] = '******';
|
||||
}
|
||||
|
||||
$rule = $request->url();
|
||||
$menu = '';
|
||||
$menus = Menu::where('rule', '=', $rule)->order('pid', 'asc')->select()->toArray();
|
||||
if ($menus) {
|
||||
for ($i = 1; $i <= 4; $i++) {
|
||||
if ($menus[0]['pid']) {
|
||||
$tempMenu = Menu::where('id', '=', $menus[0]['pid'])->find();
|
||||
if ($tempMenu) {
|
||||
$tempMenu = $tempMenu->toArray();
|
||||
array_unshift($menus, $tempMenu);
|
||||
}
|
||||
} else {
|
||||
break;
|
||||
}
|
||||
}
|
||||
$menuName = [];
|
||||
foreach ($menus as $v) {
|
||||
$menuName[] = $v['name'];
|
||||
}
|
||||
$menu = implode(' - ', $menuName);
|
||||
}
|
||||
|
||||
Log::create([
|
||||
'admin_id' => UserServiceFacade::getUser()->id,
|
||||
'rule' => $request->url(),
|
||||
'menu' => $menu,
|
||||
'request_body' => json_encode($requestBody, JSON_UNESCAPED_UNICODE),
|
||||
'request_header' => json_encode(request()->header(), JSON_UNESCAPED_UNICODE),
|
||||
'ip' => request()->ip(),
|
||||
'create_time' => date('Y-m-d H:i:s'),
|
||||
]);
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
Executable
+53
@@ -0,0 +1,53 @@
|
||||
<?php
|
||||
|
||||
namespace app\middleware\admin;
|
||||
|
||||
use app\service\admin\AuthServiceFacade;
|
||||
use app\service\admin\UserServiceFacade;
|
||||
use laytp\BaseMiddleware;
|
||||
use think\Request;
|
||||
|
||||
class Auth extends BaseMiddleware
|
||||
{
|
||||
/**
|
||||
* 执行中间件
|
||||
* @param Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle(Request $request, \Closure $next)
|
||||
{
|
||||
if (AuthServiceFacade::needLogin()) {
|
||||
// 为了兼容windows和linux获取header中驼峰命名的参数修改
|
||||
// windows中,使用原样获取,比如laytpAdminToken
|
||||
// linux中,驼峰需要转换成短横杆获取,比如laytpAdminToken要使用laytp-admin-token来获取
|
||||
$initUser = UserServiceFacade::init($request->header('laytp-admin-token', $request->header('laytpAdminToken', $request->cookie('laytpAdminToken'))));
|
||||
if (!$initUser) return $this->error(UserServiceFacade::getError(), 10401);
|
||||
if (!UserServiceFacade::isLogin()) {
|
||||
if ($request->isAjax()) {
|
||||
return $this->error('登录信息已过期', 10401);
|
||||
} else {
|
||||
return redirect('/admin/login.html');
|
||||
}
|
||||
}
|
||||
if (AuthServiceFacade::needAuth()) {
|
||||
$user = UserServiceFacade::getUser();
|
||||
if ($user->is_super_manager !== 1) {
|
||||
$userId = $user->id;
|
||||
$plugin = defined('LT_PLUGIN') ? LT_PLUGIN : '';
|
||||
$controller = strtolower(str_replace("\\", ".", $request->controller()));
|
||||
if ($plugin) {
|
||||
$node = 'plugin/' . $plugin . '/' . $controller . '/' . $request->action();
|
||||
} else {
|
||||
$node = trim(app('http')->getName() . '/' . $controller . '/' . $request->action(),'/');
|
||||
}
|
||||
|
||||
if (!AuthServiceFacade::hasAuth($userId, $node)) {
|
||||
return $this->error('无权请求:/' . $node);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
Executable
+32
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace app\middleware\api;
|
||||
|
||||
use app\service\api\AuthServiceFacade;
|
||||
use app\service\api\MemberServiceFacade;
|
||||
use laytp\BaseMiddleware;
|
||||
use think\Request;
|
||||
|
||||
class Auth extends BaseMiddleware
|
||||
{
|
||||
/**
|
||||
* 执行中间件
|
||||
* @param Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle(Request $request, \Closure $next)
|
||||
{
|
||||
if (AuthServiceFacade::needLogin()) {
|
||||
$initUser = MemberServiceFacade::init($request->header('token'));
|
||||
if (!$initUser) return $this->error(MemberServiceFacade::getError(), 10401);
|
||||
if (!MemberServiceFacade::isLogin()) {
|
||||
return $this->error('登录信息已过期', 10401);
|
||||
}
|
||||
} else {
|
||||
//不需要登录的接口,也可能需要获取登录用户的信息
|
||||
MemberServiceFacade::init($request->header('token'));
|
||||
}
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
Executable
+60
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
|
||||
namespace app\middleware\api;
|
||||
|
||||
use app\service\api\CheckSignServiceFacade;
|
||||
use app\service\ConfServiceFacade;
|
||||
use laytp\BaseMiddleware;
|
||||
use laytp\traits\JsonReturn;
|
||||
use think\Request;
|
||||
|
||||
/**
|
||||
* 签名验证中间件
|
||||
* 签名生成方式:strtoupper(md5(md5($hearder['request-time']).md5(Config::get('laytp.api.signKey'))))
|
||||
* 签名验证方式:
|
||||
* 请求的header头中需要有两个参数:
|
||||
* - request-time = 当前请求的时间,这个单位并不要求固定,甚至传的都可以不是当前请求的时间,只要sign的值是使用这个参数的值按照规定的算法生成即可
|
||||
* - sign = md5(md5($hearder['request-time']).md5(Config::get('laytp.api.signKey')))
|
||||
* 此中间件,使用header头中request-time按照签名算法生成签名,然后与header中传递的sign参数比对,看是否一致,如果一致就通过验证,如果不一致就验证失败
|
||||
* 需要设计,有些方法无需验签。比如获取配置的接口,需要得到后台配置的Config::get('laytp.api.signKey')
|
||||
* Class CheckSign
|
||||
* @package app\middleware
|
||||
*/
|
||||
class CheckSign extends BaseMiddleware
|
||||
{
|
||||
use JsonReturn;
|
||||
|
||||
/**
|
||||
* 执行中间件
|
||||
* @param Request $request
|
||||
* @param \Closure $next
|
||||
* @return mixed
|
||||
*/
|
||||
public function handle(Request $request, \Closure $next)
|
||||
{
|
||||
if (intval(ConfServiceFacade::get('system.basic.checkSign')) === 1) {
|
||||
if (CheckSignServiceFacade::needCheckSign()) {
|
||||
if (CheckSignServiceFacade::check()) {
|
||||
return $next($request);
|
||||
} else {
|
||||
if(env('APP_DEBUG')){
|
||||
return $this->error('签名验证失败',0, [
|
||||
'签名验证的规则描述' => '1. 后台系统配置->基础配置,Api签名开关需要打开,Api签名的Key需要设置(允许为空);2. 客户端在请求Api接口时,需要在header里面传递两个参数,request-time和sign,sign的值要等于strtoupper(md5(md5(header:request-time).md5(conf:signKey)))',
|
||||
'注意点' => '如果是使用的生成Api文档在线测试接口,请点击右上角Api请求配置将签名验证开关打开',
|
||||
'生成签名的规则' => 'strtoupper(md5(md5(header:request-time).md5(conf:signKey)))',
|
||||
'系统配置的生成签名的Key' => ConfServiceFacade::get('system.basic.signKey'),
|
||||
'header部分传递的request-time值' => $request->header('request-time'),
|
||||
'header部分传递的sign值' => $request->header('sign'),
|
||||
'后端计算的sign值' => CheckSignServiceFacade::getError()
|
||||
]);
|
||||
}
|
||||
return $this->error(CheckSignServiceFacade::getError());
|
||||
}
|
||||
} else {
|
||||
return $next($request);
|
||||
}
|
||||
} else {
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user