use*_*153 12 php laravel laravel-5.5
我正在使用自己的逻辑构建具有身份验证和授权的REST APIJWT.它工作得很好.现在,我想根据角色和权限动态设置路由.假设我有数据库结构,如:
角色:
id | name
1 | school
2 | transport
Run Code Online (Sandbox Code Playgroud)
权限:
id | name | controller | routes
1 | view-class-result | ApiController | getClassResult
2 | view-student-result | ApiController | studentResult
3 | download-student-result | ApiController | donwloadSchoolTemplate
Run Code Online (Sandbox Code Playgroud)
Permission_role
role_id | permission_id
1 1
1 2
1 3
Run Code Online (Sandbox Code Playgroud)
现在,我想根据数据库中的角色和权限创建路由.
目前我的路线似乎是:
//All JWT authentication API goes here
Route::group(['middleware' => 'jwt.auth'], function() {
Route::get('user', 'ApiController@getAuthUser');
Route::get('invalidate', 'ApiController@invalidate');
//All authorized API goes here
Route::group(['middleware' => 'ability:school,view-class-result,true'], function() {
Route::post('classResult', 'ApiController@getClassResult');
});
Route::group(['middleware' => 'ability:school,view-student-result,true'], function() {
Route::post('studentResult', 'ApiController@studentResult');
});
Route::group(['middleware' => 'ability:school,download-student-result,true'], function() {
Route::post('getStudentExamResult', 'ApiController@downloadSchoolTemplate');
});
});
Run Code Online (Sandbox Code Playgroud)
我不希望上面的路由被硬编码.如何从数据库中获取此路由.像下面的东西.但是不知道该怎么做.
在路径文件中,
$a = User:all();
foreach($a->roles as $value){
foreach($value->permission as $val){
Route::group(['middleware' => 'ability:{$value->name},{$val->name},true'], function() {
Route::post('{$val->controller}', '{$val->controller}@{$val->method}');
});
}
}
Run Code Online (Sandbox Code Playgroud)
谢谢.
Ham*_*raj 11
最好的想法是使用中间件参数创建中间件调用CheckPermission然后你必须将该中间件注册到你的app/Http/kernel.php文件中,只有你需要检查下面的代码
你的kernel.php文件
protected $routeMiddleware = [
'checkPermission' => \App\Http\Middleware\CheckPermission::class,
];
Run Code Online (Sandbox Code Playgroud)
CheckPermission.php
<?php
namespace App\Http\Middleware;
use Closure;
use DB;
class CheckPermission
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next,$permission_name)
{
//first check that name in your db
$permission = DB::table('Permission')->where('name',$permission_name)->first()
if($permission){
//here you have to get logged in user role
$role_id = Auth::user()->role;
## so now check permission
$check_permission = DB::table('Permission_role')->where('role_id',$role_id)->where('permission_id',$permission->id)->first();
if($check_permission){
return $next($request);
}
//if Permission not assigned for this user role show what you need
}
// if Permission name not in table then do what you need
## Ex1 : return 'Permission not in Database';
## Ex2 : return redirect()->back();
}
}
Run Code Online (Sandbox Code Playgroud)
您的路线文件
Route::group(['middleware' => 'jwt.auth'], function() {
Route::post('classResult', 'ApiController@getClassResult')->middleware('checkPermission:view-class-result');
Route::post('studentResult', 'ApiController@studentResult')->middleware('checkPermission:view-student-result');
Route::post('getStudentExamResult', 'ApiController@downloadSchoolTemplate')->middleware('checkPermission:download-student-result');
}
Run Code Online (Sandbox Code Playgroud)
小智 0
因此,您可以做的就是让您的角色名称accountants成为在.env文件中键入的值,并且每个角色名称都相同。
如果您想在不久的将来更改它,您可以在.env文件中手动更改它,或者您可以通过在Laravel 函数之一上编写的php代码在.env文件中进行更改。