IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> PHP知识库 -> Yii Login路由访问顺序 -> 正文阅读

[PHP知识库]Yii Login路由访问顺序

1、问题描述

在我们输入后台的ip或者域名的时候,浏览器展示给我们的url如下:

/index.php?r=site%2Flogin

但是很显然,SiteController控制器下的默认动作是index,因此这里就产生了两个问题:

  • Yii是如何在运行web/index.php后知道要去访问site/index的?
  • 访问site/index后,怎么跳转到site/login页面的?

本文主要围绕这两个问题进行讲解。

2、应用主体

Yii中一个很重要的概念就是应用主体,Yii在创建应用主体的时候有个属性为[KaTeX parse error: Expected 'EOF', got '#' at position 71: …web-application#?defaultRoute-detail)指定了默认要访问的控制器,其定义在yii\web\Application中,我们来看一下web/index.php的代码:

<?php
    
... ...

(new yii\web\Application($config))->run();

大家可以看到,最后一行代码是创建了一个yii\web\Application的实例,因此Yii会按照实例里配置的[KaTeX parse error: Expected 'EOF', got '#' at position 71: …web-application#?defaultRoute-detail)来将请求发送到相对应的控制器。

那如何改变默认的路由呢?

大家可以在$config中去修改默认的路由配置,比如说在config/main-local.php中修改:

<?php

$config = [
    ... ...
    'defaultRoute' => "site1"
];
... ...

3、默认动作

默认的动作是在\yii\base\Controller中定义的,属性名称为:$defaultAction,从代码中得知,默认的值如下:

public $defaultAction = 'index';

到这里为止,大家应该知道为什么Yii在url中没有注明任何路由信息的时候会把请求发送到site/index了,至于要改变这个规则,只需要修改默认的属性值就可以。

4、访问控制

接下来,我们讨论一下为什么在未登录的情况下会跳转到site/login,要知道在site/index中并没有跳转的代码:

class SiteController extends Controller
{
    ... ...
    public function actionIndex()
    {
        return $this->render('index');
    }
    ... ...
}

那它怎么获得用户登录的信息,并把未登录的请求转发到site/login呢?大家注意,在如下代码中使用了权限控制:

class SiteController extends Controller
{
    /**
     * {@inheritdoc}
     */
    public function behaviors()
    {
        return [
            'access' => [
                'class' => AccessControl::className(),
                'rules' => [
					... ...
                    //允许授权的用户访问login,index动作
                    [
                        'actions' => ['logout', 'index'],
                        'allow' => true,
                        'roles' => ['@'],
                    ],
                ],
            ],
			... ...
        ];
    }
    ... ...
}

也就是说site/index是需要用户登录后才可以访问的,判断访问权限的代码在上述指定的AccessControl类中:

class AccessControl extends ActionFilter
{
    protected function denyAccess($user)
    {
        if ($user !== false && $user->getIsGuest()) {
            $user->loginRequired();
        } else {
            throw new ForbiddenHttpException(Yii::t('yii', 'You are not allowed to perform this action.'));
        }
    }
    ... ...
}

当用户未登录时,会调用denyAccess()方法,这个方法会调用$user->loginRequired()来执行接下来的跳转任务:

public function loginRequired($checkAjax = true, $checkAcceptHeader = true)
{
    ...
        return Yii::$app->getResponse()->redirect($this->loginUrl);
    ...
}

也就是说跳转的目的地是$this->loginUrl的值,我们看一下它的值是什么:

public $loginUrl = ['site/login'];

大家可以看到,其值是site/login,到此大家应该可以理解为什么在未登录的情况下会跳转到site/login页面了。

关注我的微信公众号,更多文章推送不遗漏
在这里插入图片描述

  PHP知识库 最新文章
Laravel 下实现 Google 2fa 验证
UUCTF WP
DASCTF10月 web
XAMPP任意命令执行提升权限漏洞(CVE-2020-
[GYCTF2020]Easyphp
iwebsec靶场 代码执行关卡通关笔记
多个线程同步执行,多个线程依次执行,多个
php 没事记录下常用方法 (TP5.1)
php之jwt
2021-09-18
上一篇文章      下一篇文章      查看所有文章
加:2021-07-13 17:13:58  更:2021-07-13 17:15:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/1 4:29:05-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码