You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
418 lines
13 KiB
418 lines
13 KiB
<?php
|
|
|
|
namespace App\Http\Controllers\Api;
|
|
|
|
use App\Http\Resources\AuthRule;
|
|
use App\Libs\MyLib;
|
|
use App\Models\AuthRuleT;
|
|
use App\Models\EmployeeGroupT;
|
|
use App\Models\EmployeeT;
|
|
use Illuminate\Http\Request;
|
|
use App\Http\Resources\AuthRuleCollection;
|
|
|
|
/**
|
|
* @title 权限认证管理
|
|
* @description 用户登录及权限管理
|
|
* @package App\Http\Controllers\Api
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
class AuthController extends BaseController
|
|
{
|
|
|
|
protected $rules = [
|
|
'login' => [
|
|
'rules' => [
|
|
'username' => 'required',
|
|
'password' => 'required',
|
|
],
|
|
'messages' => [
|
|
'username.required' => '用户名不能为空',
|
|
'password.required' => '密码不能为空'
|
|
],
|
|
],
|
|
'modifyPassword' => [
|
|
'rules' => [
|
|
'id' => 'bail|min:1',
|
|
'oldPassword' => 'required',
|
|
'newPassword' => 'required',
|
|
],
|
|
'custom' => 'exists,App\Models\EmployeeT,id'
|
|
],
|
|
'resetPassword' => [
|
|
'rules' => [
|
|
'id' => 'bail|min:1',
|
|
],
|
|
'custom' => 'exists,App\Models\EmployeeT,id'
|
|
],
|
|
'EmployeeAuth' => [
|
|
'rules' => [
|
|
'id' => 'bail|min:1',
|
|
'rules' => 'required'
|
|
],
|
|
'custom' => 'exists,App\Models\EmployeeT,id'
|
|
],
|
|
'EmployeeGroupAuth' => [
|
|
'rules' => [
|
|
'id' => 'bail|min:1',
|
|
'rules' => 'required'
|
|
],
|
|
'custom' => 'exists,App\Models\EmployeeGroupT,id'
|
|
],
|
|
'store' => [
|
|
'rules' => [
|
|
'title' => 'required|max:20',
|
|
'name' => 'bail|required|unique:App\Models\AuthRuleT|max:20',
|
|
'method' => 'required|in:GET,POST,PUT,PATCH,DELETE',
|
|
'group' => 'required',
|
|
'module' => 'required',
|
|
],
|
|
'custom' => [
|
|
'unique,App\Models\AuthRuleT,name'
|
|
]
|
|
],
|
|
'show' => [
|
|
'rules' => [
|
|
'id' => 'bail|min:1',
|
|
],
|
|
'custom' => 'exists,App\Models\AuthRuleT,id'
|
|
],
|
|
'update' => [
|
|
'rules' => [
|
|
'id' => 'bail|min:1',
|
|
'title' => 'required|max:20',
|
|
'name' => 'bail|required|max:20',
|
|
'method' => 'required|in:GET,POST,PUT,PATCH,DELETE',
|
|
'group' => 'required',
|
|
'module' => 'required',
|
|
],
|
|
'custom' => [
|
|
'exists,App\Models\AuthRuleT,id',
|
|
'unique,App\Models\AuthRuleT,name,id'
|
|
]
|
|
],
|
|
'destroy' => [
|
|
'rules' => [
|
|
'id' => 'bail|min:1',
|
|
],
|
|
'custom' => [
|
|
'exists,App\Models\AuthRuleT,id',
|
|
]
|
|
]
|
|
];
|
|
|
|
|
|
public function __construct(Request $request)
|
|
{
|
|
$this->model = new AuthRuleT();
|
|
parent::__construct($request);
|
|
}
|
|
|
|
/**
|
|
* @title 登录
|
|
* @description 登录授权,返回jwt凭据
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function login()
|
|
{
|
|
if (!$token = auth('api')->attempt([
|
|
'username' => $this->params['username'],
|
|
'password' => $this->params['password'],
|
|
])) {
|
|
return $this->error(401, '登录失败,用户名或密码错误');
|
|
}
|
|
|
|
return $this->success([
|
|
'access_token' => $token,
|
|
'token_type' => 'bearer',
|
|
'expires_in' => auth('api')->factory()->getTTL() * 60
|
|
]);
|
|
}
|
|
|
|
/**
|
|
* @title 注销登录
|
|
* @description 注销登录,全局退出并通知其他系统退出
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function logout()
|
|
{
|
|
auth('api')->logout();
|
|
return $this->success();
|
|
}
|
|
|
|
/**
|
|
* @title 刷新token
|
|
* @description 刷新token,如果开启黑名单,以前的token便会失效
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function refresh()
|
|
{
|
|
try {
|
|
$token = auth('api')->refresh();
|
|
return $this->success([
|
|
'access_token' => $token,
|
|
'token_type' => 'bearer',
|
|
'expires_in' => auth('api')->factory()->getTTL() * 60
|
|
]);
|
|
} catch (\Exception $e){
|
|
return $this->error(403, '令牌已过期');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title 修改密码
|
|
* @description 本人或管理员修改密码
|
|
* @param $id
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/2/2
|
|
*/
|
|
public function modifyPassword($id){
|
|
$user = auth('api')->user();
|
|
if($user['id'] != $id && $user['id'] != 1){
|
|
return $this->error(403, '权限不足');
|
|
}
|
|
$employee = EmployeeT::find($id);
|
|
if(!password_verify($this->params['oldPassword'], $employee['password'])){
|
|
return $this->error(403, '原密码错误');
|
|
};
|
|
$employee->password = password_hash($this->params['newPassword'], PASSWORD_DEFAULT);
|
|
if($employee->save()){
|
|
return $this->success('','密码修改成功');
|
|
} else {
|
|
return $this->error(500, '配置信息保存失败');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title 重置密码
|
|
* @description 管理员重置密码
|
|
* @param $id
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/2/2
|
|
*/
|
|
public function resetPassword($id)
|
|
{
|
|
if(auth('api')->user()['id'] != 1){
|
|
return $this->error(403, '权限不足');
|
|
}
|
|
EmployeeT::where('id',$id)->update(['password' => password_hash('123456', PASSWORD_DEFAULT)]);
|
|
auth('api')->tokenById('id');
|
|
return $this->success('','密码重置成功');
|
|
}
|
|
|
|
/**
|
|
* @title 用户授权
|
|
* @description 单用户授权
|
|
* @param $id
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/2/2
|
|
*/
|
|
public function EmployeeAuth($id)
|
|
{
|
|
$user = EmployeeT::find($id);
|
|
$authList = $user->getAuthList();
|
|
$rules = array_diff($this->params['rules'], array_intersect($this->params['rules'], $authList));
|
|
$user->rules = implode(',', $rules);
|
|
if($user->save()){
|
|
return $this->success('','权限添加成功,用户需重新登录获取权限');
|
|
} else {
|
|
return $this->error(500, '配置信息保存失败');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title 用户组授权
|
|
* @description 用户组授权
|
|
* @param $id
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/2/3
|
|
*/
|
|
public function EmployeeGroupAuth($id)
|
|
{
|
|
$group = EmployeeGroupT::find($id);
|
|
$rules = array_diff($this->params['rules'], array_intersect($this->params['rules'], explode(',',$group->rules)));
|
|
$group->rules = implode(',', $rules);
|
|
if($group->save()){
|
|
return $this->success('','权限添加成功,用户需重新登录获取权限');
|
|
} else {
|
|
return $this->error(500, '配置信息保存失败');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title 节点列表
|
|
* @description 权限节点列表
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function index()
|
|
{
|
|
$query = AuthRuleT::query();
|
|
if(isset($this->params['name']) && $this->params['name'] != ''){
|
|
$query->where('name', $this->params['name']);
|
|
}
|
|
if(isset($this->params['title']) && $this->params['title'] != ''){
|
|
$query->where('title', 'like', '%'. $this->params['title'] .'%');
|
|
}
|
|
|
|
if(isset($this->params['status']) && $this->params['status'] >= 0){
|
|
$query->where('status', $this->params['status']);
|
|
} else {
|
|
$query->where('status', 1);
|
|
}
|
|
|
|
$data = $query->paginate();
|
|
|
|
return $this->success(new AuthRuleCollection($data));
|
|
}
|
|
|
|
/**
|
|
* @title 节点新增
|
|
* @description 手动创建节点
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function store()
|
|
{
|
|
$rule = new AuthRuleT();
|
|
$rule->title = $this->params['title'];
|
|
$rule->name = $this->params['name'];
|
|
$rule->method = $this->params['method'] ?? '';
|
|
$rule->desc = $this->params['desc'] ?? '';
|
|
$rule->module = $this->params['module'];
|
|
$rule->group = $this->params['group'];
|
|
$rule->condition = $this->params['condition'] ?? '';
|
|
$rule->status = $this->params['status'] ?? 1;
|
|
if($rule->save()){
|
|
return $this->success(new AuthRule($rule));
|
|
} else {
|
|
return $this->error(500, '配置信息保存失败');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title 节点详情
|
|
* @description 节点详情
|
|
* @param $id
|
|
* @return mixed
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function show($id)
|
|
{
|
|
$rule = AuthRuleT::find($id);
|
|
return $this->success(new AuthRule($rule));
|
|
}
|
|
|
|
/**
|
|
* @title 节点更新
|
|
* @description 节点更新
|
|
* @param $id
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function update($id)
|
|
{
|
|
$rule = AuthRuleT::find($id);
|
|
$rule->title = $this->params['title'];
|
|
$rule->name = $this->params['name'];
|
|
$rule->method = $this->params['method'] ?? $rule->method;
|
|
$rule->desc = $this->params['desc'] ?? $rule->desc;
|
|
$rule->module = $this->params['module'];
|
|
$rule->group = $this->params['group'];
|
|
$rule->condition = $this->params['condition'] ?? $rule->condition;
|
|
$rule->status = $this->params['status'] ?? $rule->status;
|
|
if($rule->save()){
|
|
return $this->success(new AuthRule($rule));
|
|
} else {
|
|
return $this->error(500, '配置信息保存失败');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title 节点扫描
|
|
* @description 扫描控制器目录,更新或创建权限节点
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @throws \ReflectionException
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function scanNode(){
|
|
$path = app_path('Http/Controllers');
|
|
$dirs = scandir($path);
|
|
$list = [];
|
|
foreach ($dirs as $dir) {
|
|
if ($dir != '.' && $dir != '..' && is_dir($path . DIRECTORY_SEPARATOR . $dir)) {
|
|
$classes = MyLib::scanFile($path . DIRECTORY_SEPARATOR . $dir);
|
|
foreach ($classes as $class) {
|
|
if($class == 'BaseController'){
|
|
continue;
|
|
}
|
|
$classname = "App\\Http\\Controllers\\" . $dir . "\\" . $class;
|
|
if (class_exists($classname)) {
|
|
$reflection = new \ReflectionClass($classname);
|
|
$group_doc = MyLib::Parser($reflection->getDocComment());
|
|
$methods = $reflection->getMethods(\ReflectionMethod::IS_FINAL | \ReflectionMethod::IS_PUBLIC);
|
|
$group_doc['name'] = $class;
|
|
foreach ($methods as $key => $method) {
|
|
if (!in_array($method->name, ['__construct'])) {
|
|
$title_doc = MyLib::Parser($method->getDocComment());
|
|
$title_doc['param'] = $title_doc['param'] ?? [];
|
|
unset($title_doc['param']['Request']);
|
|
if (isset($title_doc['title']) && $title_doc['title']) {
|
|
$route = app('router')->getRoutes()->getByAction($classname .'@'. $method->name);
|
|
$list[] = array(
|
|
'title' => trim($title_doc['title']),
|
|
'name' => $route->uri(),
|
|
'desc' => trim($title_doc['description']),
|
|
'group' => trim($group_doc['title']),
|
|
'method' => $route->methods()[0],
|
|
'module' => $dir,
|
|
);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
if(AuthRuleT::upsert($list, ['name', 'module'], ['title', 'desc', 'group'])){
|
|
return $this->success();
|
|
} else {
|
|
return $this->error(500,'权限节点更新失败');
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @title 节点删除
|
|
* @description 软删除
|
|
* @param $id
|
|
* @return \Illuminate\Http\JsonResponse
|
|
* @author zcstatham
|
|
* @time 2021/1/28
|
|
*/
|
|
public function destroy($id)
|
|
{
|
|
$rule = AuthRuleT::find($id);
|
|
$rule->status = 0;
|
|
if($rule->save()){
|
|
return $this->success();
|
|
} else {
|
|
return $this->error(500, '配置信息保存失败');
|
|
}
|
|
}
|
|
}
|
|
|