163 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
		
		
			
		
	
	
			163 lines
		
	
	
		
			4.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| 
								 | 
							
								<?php
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								namespace app\common\controller;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								use app\common\library\Auth;
							 | 
						||
| 
								 | 
							
								use think\Config;
							 | 
						||
| 
								 | 
							
								use think\Controller;
							 | 
						||
| 
								 | 
							
								use think\Hook;
							 | 
						||
| 
								 | 
							
								use think\Lang;
							 | 
						||
| 
								 | 
							
								use think\Loader;
							 | 
						||
| 
								 | 
							
								use think\Validate;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * 前台控制器基类
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								class Frontend extends Controller
							 | 
						||
| 
								 | 
							
								{
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 布局模板
							 | 
						||
| 
								 | 
							
								     * @var string
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $layout = '';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 无需登录的方法,同时也就不需要鉴权了
							 | 
						||
| 
								 | 
							
								     * @var array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $noNeedLogin = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 无需鉴权的方法,但需要登录
							 | 
						||
| 
								 | 
							
								     * @var array
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $noNeedRight = [];
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 权限Auth
							 | 
						||
| 
								 | 
							
								     * @var Auth
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected $auth = null;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    public function _initialize()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        //移除HTML标签
							 | 
						||
| 
								 | 
							
								        $this->request->filter('trim,strip_tags,htmlspecialchars');
							 | 
						||
| 
								 | 
							
								        $modulename = $this->request->module();
							 | 
						||
| 
								 | 
							
								        $controllername = Loader::parseName($this->request->controller());
							 | 
						||
| 
								 | 
							
								        $actionname = strtolower($this->request->action());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 检测IP是否允许
							 | 
						||
| 
								 | 
							
								        check_ip_allowed();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 如果有使用模板布局
							 | 
						||
| 
								 | 
							
								        if ($this->layout) {
							 | 
						||
| 
								 | 
							
								            $this->view->engine->layout('layout/' . $this->layout);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								        $this->auth = Auth::instance();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // token
							 | 
						||
| 
								 | 
							
								        $token = $this->request->server('HTTP_TOKEN', $this->request->request('token', \think\Cookie::get('token')));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $path = str_replace('.', '/', $controllername) . '/' . $actionname;
							 | 
						||
| 
								 | 
							
								        // 设置当前请求的URI
							 | 
						||
| 
								 | 
							
								        $this->auth->setRequestUri($path);
							 | 
						||
| 
								 | 
							
								        // 检测是否需要验证登录
							 | 
						||
| 
								 | 
							
								        if (!$this->auth->match($this->noNeedLogin)) {
							 | 
						||
| 
								 | 
							
								            //初始化
							 | 
						||
| 
								 | 
							
								            $this->auth->init($token);
							 | 
						||
| 
								 | 
							
								            //检测是否登录
							 | 
						||
| 
								 | 
							
								            if (!$this->auth->isLogin()) {
							 | 
						||
| 
								 | 
							
								                $this->error(__('Please login first'), 'index/user/login');
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								            // 判断是否需要验证权限
							 | 
						||
| 
								 | 
							
								            if (!$this->auth->match($this->noNeedRight)) {
							 | 
						||
| 
								 | 
							
								                // 判断控制器和方法判断是否有对应权限
							 | 
						||
| 
								 | 
							
								                if (!$this->auth->check($path)) {
							 | 
						||
| 
								 | 
							
								                    $this->error(__('You have no permission'));
							 | 
						||
| 
								 | 
							
								                }
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        } else {
							 | 
						||
| 
								 | 
							
								            // 如果有传递token才验证是否登录状态
							 | 
						||
| 
								 | 
							
								            if ($token) {
							 | 
						||
| 
								 | 
							
								                $this->auth->init($token);
							 | 
						||
| 
								 | 
							
								            }
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $this->view->assign('user', $this->auth->getUser());
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 语言检测
							 | 
						||
| 
								 | 
							
								        $lang = $this->request->langset();
							 | 
						||
| 
								 | 
							
								        $lang = preg_match("/^([a-zA-Z\-_]{2,10})\$/i", $lang) ? $lang : 'zh-cn';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $site = Config::get("site");
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        $upload = \app\common\model\Config::upload();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 上传信息配置后
							 | 
						||
| 
								 | 
							
								        Hook::listen("upload_config_init", $upload);
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 配置信息
							 | 
						||
| 
								 | 
							
								        $config = [
							 | 
						||
| 
								 | 
							
								            'site'           => array_intersect_key($site, array_flip(['name', 'cdnurl', 'version', 'timezone', 'languages'])),
							 | 
						||
| 
								 | 
							
								            'upload'         => $upload,
							 | 
						||
| 
								 | 
							
								            'modulename'     => $modulename,
							 | 
						||
| 
								 | 
							
								            'controllername' => $controllername,
							 | 
						||
| 
								 | 
							
								            'actionname'     => $actionname,
							 | 
						||
| 
								 | 
							
								            'jsname'         => 'frontend/' . str_replace('.', '/', $controllername),
							 | 
						||
| 
								 | 
							
								            'moduleurl'      => rtrim(url("/{$modulename}", '', false), '/'),
							 | 
						||
| 
								 | 
							
								            'language'       => $lang
							 | 
						||
| 
								 | 
							
								        ];
							 | 
						||
| 
								 | 
							
								        $config = array_merge($config, Config::get("view_replace_str"));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        Config::set('upload', array_merge(Config::get('upload'), $upload));
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        // 配置信息后
							 | 
						||
| 
								 | 
							
								        Hook::listen("config_init", $config);
							 | 
						||
| 
								 | 
							
								        // 加载当前控制器语言包
							 | 
						||
| 
								 | 
							
								        $this->loadlang($controllername);
							 | 
						||
| 
								 | 
							
								        $this->assign('site', $site);
							 | 
						||
| 
								 | 
							
								        $this->assign('config', $config);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 加载语言文件
							 | 
						||
| 
								 | 
							
								     * @param string $name
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected function loadlang($name)
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $name = Loader::parseName($name);
							 | 
						||
| 
								 | 
							
								        $name = preg_match("/^([a-zA-Z0-9_\.\/]+)\$/i", $name) ? $name : 'index';
							 | 
						||
| 
								 | 
							
								        $lang = $this->request->langset();
							 | 
						||
| 
								 | 
							
								        $lang = preg_match("/^([a-zA-Z\-_]{2,10})\$/i", $lang) ? $lang : 'zh-cn';
							 | 
						||
| 
								 | 
							
								        Lang::load(APP_PATH . $this->request->module() . '/lang/' . $lang . '/' . str_replace('.', '/', $name) . '.php');
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 渲染配置信息
							 | 
						||
| 
								 | 
							
								     * @param mixed $name  键名或数组
							 | 
						||
| 
								 | 
							
								     * @param mixed $value 值
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected function assignconfig($name, $value = '')
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $this->view->config = array_merge($this->view->config ? $this->view->config : [], is_array($name) ? $name : [$name => $value]);
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    /**
							 | 
						||
| 
								 | 
							
								     * 刷新Token
							 | 
						||
| 
								 | 
							
								     */
							 | 
						||
| 
								 | 
							
								    protected function token()
							 | 
						||
| 
								 | 
							
								    {
							 | 
						||
| 
								 | 
							
								        $token = $this->request->param('__token__');
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //验证Token
							 | 
						||
| 
								 | 
							
								        if (!Validate::make()->check(['__token__' => $token], ['__token__' => 'require|token'])) {
							 | 
						||
| 
								 | 
							
								            $this->error(__('Token verification error'), '', ['__token__' => $this->request->token()]);
							 | 
						||
| 
								 | 
							
								        }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        //刷新Token
							 | 
						||
| 
								 | 
							
								        $this->request->token();
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								}
							 |