前言
由于laravel插件不支持laravel8.*导致出现错误就想着自己研究一下RBAC的流程,这次发布的内容理论上支持任何laravel的框架,大家可以自己试一试权限系统。
1.首先理清楚RBAC的流程
提示:
1、 创建权限
2、 将权限赋值给角色
3、 用户选择角色来控制具体的操作
4、 整理起来就是用户角色权限的关系
RBAC的功能模块:
RBAC的数据表的设计:
1.user表
public function up()
{
Schema::create('users', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->comment('用户昵称');
$table->string('username')->unique()->comment('用户账号');
$table->bigInteger('is_admin')->default(0)->comment('是否是管理员|1是|0否');
$table->bigInteger('status')->default(1)->comment('用户状态|2后台|1前端|0禁止访问');
$table->string('icon')->nullable()->comment('用户头像');
$table->timestamp('time')->nullable();
$table->string('password')->comment('用户密码');
$table->rememberToken();
$table->timestamps();
});
}
2.role表
public function up()
{
Schema::create('roles', function (Blueprint $table) {
$table->increments('id');
$table->string('name')->unique()->comment('角色名称');
$table->bigInteger('status')->default(1)->comment('角色状态|1正常|0屏蔽');
$table->timestamps();
});
}
3.permission表
public function up()
{
Schema::create('permissions', function (Blueprint $table) {
$table->increments('id');
$table->string('permissions_name')->comment('权限名称');
$table->string('urls')->nullable()->comment('页面的路由');
$table->integer('permission_id')->default(0)->comment('上级权限ID|0为顶级ID');
$table->string('icon')->nullable()->comment('权限图标');
$table->string('icon_1')->nullable()->comment('权限图标名称');
$table->integer('sort')->nullable()->comment('权限列表排序');
$table->bigInteger('status')->default(1)->comment('权限状态|1正常|0屏蔽');
$table->timestamps();
});
}
4.role_permission表
public function up()
{
Schema::create('role_permissions', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('role_id')->comment('角色ID');
//$table->foreign('被约束的字段')->references('约束的字段')->on('约束的表名')->onDelete('受此约束删除');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->unsignedInteger('permission_id')->comment('权限ID');
//$table->foreign('被约束的字段')->references('约束的字段')->on('约束的表名')->onDelete('受此约束删除');
$table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');
$table->timestamps();
});
}
5.user_roles表
public function up()
{
Schema::create('user_roles', function (Blueprint $table) {
$table->id();
$table->unsignedInteger('user_id')->comment('用户ID');
//$table->foreign('被约束的字段')->references('约束的字段')->on('约束的表名')->onDelete('受此约束删除');
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->unsignedInteger('role_id')->comment('角色ID');
//$table->foreign('被约束的字段')->references('约束的字段')->on('约束的表名')->onDelete('受此约束删除');
$table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');
$table->timestamps();
});
}
RBAC的控制器的设计:
1.UserController
<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Requests\Admin\UserRequest;
use App\Http\Requests\Requests\Admin\UserRoleRequest;
use App\Models\Role;
use App\Models\User;
use App\Models\UserRole;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
class UserController extends Controller
{
/**
* Display a listing of the resource.
*
* @return \Illuminate\Http\Response
*/
public function index()
{
$user = User::paginate(10);
return view('admin.user.index',compact('user'));
}
/**
* Show the form for creating a new resource.
*
* @return \Illuminate\Http\Response
*/
public function create()
{
return view('admin.user.create');
}
/**
* Store a newly created resource in storage.
*
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\Response
*/
public function store(UserRequest $request,User $user)
{
$request['password'] = bcrypt($request['password']);
if (auth('web')->user()->is_admin == 1){
$user->fill($request->all());
$user->save();
}else{
$user->create([
'name' => $request['name'],
'username' => $request['username'],
'password' => $request['password'],
]);
}
return redirect('/admin/user')->with('success', '保存成功');
}
/**
* Show the form for editing the specified resource.
*
* @param int $id
* @return \Illuminate\Http\Response
*/
public function edit($id,User $user)
{
$user = $user->where('id',$id)->first();
return view('admin.user.edit',compact('user'));
}
/**
* Update the specified resource in storage.
*
* @param \Illuminate\Http\Request $request
* @param int $id
* @return \Illuminate\Http\Response
*/
public function update(UserRequest $request, $id,User $user)
{
if ($request['password']){
$request['password'] = bcrypt($request['password']);
$list = [
'name' => $request['name'],
'username' => $request['username'],
'password' => $request['password'],
'is_admin' => $request['is_admin'],
'status' => $request['status'],
];
$lists = [