author:咔咔
wechat:fangkangfk
1.首先是用户登录校验
2.用户登入后
if ($user->is_system == 1) {
// 计入用户的权限
SC::setIsSystem(true);
// 计入用户的权限
SC::setUserRole(Rbac::getRoleModule($user->role_id));
} else {
SC::setIsSystem(false);
}
在项目访问的时候
因为中间件配置的是全局的,所以必然会进到AuthMiddleware这个中间件
在这里我们里边有个test的单元测试模块这里需要规避一下
方法的解释:
1.1checkWhite()
白名单列表
1.2onlyCheck() 方法用来校验唯一登陆的(不懂得去看,这块就不解释了)
1.3通过 OnlyLogin::onlyCheck() 进行用户只允许在一个地方登入校验判断,然后再通过 Rbac类中的check方法 做权限校验
做验证之前,首先通过初始化的构造函数对于用户请求url进行初始化操作,同时定义好需要校验的权限模块(authModule)
然后在获取系统角色权限列表(放置到用户登录成功后存入用户的角色参数中)
具体校验方法就是check()方法
$this->module 是用户访问当前的模块
$this->authModule 是自己规定需要校验的模块
判断用户访问的模块是否需要权限的校验 如果不在规定模块里面那么就允许访问
checkModule()具体的验证用户权限方法
这里有一个SC::getUserRole()方法
权限验证完成
中间件源码:
<?PHP
namespace app\http;
use SC,OnlyLogin,Rbac,Log;
class AuthMiddleware
{
public function handle($request,\Closure $next)
{
//规避单元测试模块的正常访问
if(request()->module() == 'test'){
return $next($request);
}
/**
* 使用中间件进行白名单判断,判断用户是否权限需要校验
* Rbac::checkWhite()返回的是boolean
* true不需要校验直接返回请求
*/
if(Rbac::checkWhite()){
return $next($request);
}
/**
* 检测用户是否是唯一登录
*/
if (OnlyLogin::onlyCheck()) {
Log::write('唯一登录进入了');
/**
* 检测用户是否有权限
*/
if(Rbac::check()){
Log::write('权限不需要校验');
return $next($request);
}else{
return redirect($request->module().'/login/login');
}
}else{
return redirect('你被T了');
}
}
}