7.5 访问控制
在网站或者系统规划中,有些URL只能让特定的用户访问,比如:“用户中心”只能让登录的用户访问,VIP资源只能让有VIP资格的用户访问,网站后台的某些功能只能让有权限的特定管理员或角色访问。这些都是访问控制的范畴。
本框架全部是根据路由来调度资源,所以,您可以轻松控制用户访问的资源。下面以后台管理员权限控制为例讲解。
为了统一管理路由,您可以先创建一个通用的控制器类,存放于 application/common目录,然后让所有的控制器类继承自此类,这样您就能很方便的控制用户的访问了。此外,公共类的好处是,此类中可以提供系统常用的方法,各个子类可以直接调用,编程效率会大大提高,同时也减少代码的冗余度。
示例如下:
假设公共类类名为AdminController:
/**
* 后台管理控制器基类
* 后台管理的所有控制器都要继承自此类,以便访问控制
*/
class CAdminController extends HController{
public function __construct(){
H::sessionStart('admin');//启动SESSION 同时设置SESSION可用平台范围,仅限于admim模块
//执行权限检查
if($this->access()){//通过权限检查 继续执行其他的逻辑操作
return;
}
else{
$this->show(0, '您没当前操作的权限');
}
die();
}
/**
* 判断用户是否可以访问当前路由
* @param string $route 待判断的路由;默认为空,表示当前路由
* @return boolen 是否可以访问 true=可以访问
*/
public function access($route=''){
//配置通用权限,下面两行实际上可以放在一个配置文件中
$guestRoute = array('admin/login', 'passport/imgcode');//配置未登录用户可以访问的路由
$adminRoute = array('admin/main', 'admin/logout');//配置所有登录用户都可以访问的路由
$route = H::request()->controller().'/'.H::request()->action();//当前请求的路由;
//所有用户都可以访问的路由
if(!H::user()->isLogin()){//用户未登录
if(in_array($route, $guestRoute)){
return true;
}
else{
return false;
}
}
else{//用户已登录
//授权登录用户访问公开的路由
if(in_array($route, $guestRoute)){
return true;
}
//授权登录用户访问登录用户的公共路由
if(in_array($route, $adminRoute){
return true;
}
//授权用户访问特定的路由
$privateRoute = H::user()->get('routes');//用户登录时被赋予的特定路由
if(in_array($route, $privateRoute){
return true;
}
return false;//拒绝访问
}
}
//其他的公共代码......
}
关键词:MVC访问控制 路由授权 管理员登录 PHP权限检查 公共控制器类
阅读:2769 |
发布时间:2019-01-03 23:14