我使用的用户级别的这种结构:
Company Owner
- Group Manager
-- Unit Manager
---Employee
我需要控制用户访问数据库中的DATAS。员工只能访问数据单项存放着什么。该部门经理可以访问自己的DATAS和他emplyee的DATAS了。集团经理可以访问到整个集团的DATAS。而且公司所有者可以存取要求的一切。
我有一些控制器是这样的:
class ClientController extends Controller
{
public function index()
{
return Client::all();
}
// ...
}
什么是Laravel的最佳实践,以控制某些控制器访问DATAS(不是控制器),而不是到处?在这里针对此问题的很好的执行?
中间件是访问控制正确的地方。对于组中间件你可以使用这种格式
Route::group(['middleware' => ['role:Company Owner']], function() {
Route::get('/', 'AdminController@welcome');
Route::get('/manage', ['middleware' => ['permission:manage-admins'], 'uses' => 'AdminController@manageAdmins']);
});
Route::group(['middleware' => ['role:Employee']], function() {
Route::get('/', 'AdminController@welcome');
Route::get('/manage', ['middleware' => ['permission:manage-admins'], 'uses' => 'AdminController@manageAdmins']);
});
对于单路
Route::put('post/{id}', function ($id) {
//
})->middleware('role:Employee');
您可以使用一个包基于用户角色的访问控制
您可以创建一个中间件为每个角色,然后在web.php文件,使用路由组来分配访问权限,该用户可以访问的路由。所以,对于员工和部门经理可以访问的路线,你可以在两个中间件,对于那些只有群管理员才能访问,你只是通过部门经理。
Route::group(['middleware' => ['auth', 'group-manager','unit-manager']],
function() {
Route::get('client','ClientController@index');
});
在路线。一个好地方,所有的中间件。
Route::get('/', function () { ... })->middleware('web');
也许问题不是很清楚,但我找到了解决办法:
<?php
namespace App\Scopes;
use Illuminate\Database\Eloquent\Scope;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Builder;
use Auth;
use App\User;
class DataAccessScope implements Scope
{
/**
* Apply the scope to a given Eloquent query builder.
*
* @param \Illuminate\Database\Eloquent\Builder $builder
* @param \Illuminate\Database\Eloquent\Model $model
* @return void
*/
public function apply(Builder $builder, Model $model)
{
// find the actual user
$user_id = Auth::user()->id;
$user = User::find( $user_id );
// get all employees
$employees = $user->allEmployeeFlatten();
// get only the employee's ids
$user_ids = $employees->pluck('id');
// add current user's id too
$user_ids->push( $user_id );
// add the condition to every sql query
$builder->whereIn('user_id', $user_ids);
}
}
这里是User
模型allEmployeeFaletten()
功能:
public function allEmployeeFlatten() {
$employees = new Collection();
foreach ( $this->employee()->get() as $employee ) {
$employees->push( $employee );
// run only if the user is on a leader level
if ( $employee->user_role_id != 5 ) {
$employees = $employees->merge( $employee->allEmployeeFlatten() );
}
}
return $employees;
}
此范围添加到所有SQL条件查询我每次使用范围的时间。