ShopCMS 开发文档
HFramework 开发文档

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权限检查 公共控制器类
阅读:970 | 发布时间:01-03 23:14