yii中的http访问

来源:互联网 发布:唯品会抢购软件 编辑:程序博客网 时间:2024/05/22 17:03
yii restful
    http  
    1,HttpBasicAuth
    restful 下的controll
    // 规则
    public function behaviors()
  {
      $behaviors = parent::behaviors();
    
      $behaviors['authenticator'] = [
          'class' => HttpBasicAuth::className(),
          'auth'=>function ($username, $password) { //自定义的规则
          return \app\models\User::findOne([
              'name' => $username,
              'pwd' => $password,
              'category'=>'学生',
         ]);
      }
      ];
      return $behaviors;
  }
  /*
  * 在actions中关闭除get即index的其他所有请求方式。
  */
  public function actions()
   {
     $actions = parent::actions();

    // 禁用"delete" 和 "create" 操作
    unset($actions['view'], $actions['create'],$actions['update'],$actions['delete']); // 取消父类中的方法(针对 model的操作类型)
    // 使用"prepareDataProvider()"方法自定义数据provider
    $actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider']; //针对或者规定只能使用某一个方法进行访问
    return $actions;
   }
   //注意 在做完了函数的逻辑之后添加返回值(视频资源还不懂)之后要设定返回response的基本信息
   // $response = \Yii::$app->getResponse();//获得200 ok 响应的空壳
   //$response->setStatusCode(201);
    源码
    public function authenticate($user, $request, $response)
    {
        $username = $request->getAuthUser();
        $password = $request->getAuthPassword();

        if ($this->auth) {   //这个地方的auth用来控制是否按照以下的规则进行 所以返回必须是布尔值
            if ($username !== null || $password !== null) {
                $identity = call_user_func($this->auth, $username, $password);
                if ($identity !== null) {
                    $user->switchIdentity($identity);  
                } else {
                    $this->handleFailure($response);
                }
                return $identity;
            }
        } elseif ($username !== null) { //定义第二次(之后)登录时的登录规则 只用AccessToken登录即可
            $identity = $user->loginByAccessToken($username, get_class($this));
            if ($identity === null) {
                $this->handleFailure($response);
            }
            return $identity;
        }

        return null;
    }

    /**
     * @inheritdoc
     */
    public function challenge($response)     // 定义了发送的报头的形式
    {
        $response->getHeaders()->set('WWW-Authenticate', "Basic realm=\"{$this->realm}\"");
    }
    二 如果是我自己写的话,我就不会用这种方式
       原因有
       1,url是访问服务器关键所在,但是避免不了的是要传送参数,与其这样调用这种方法的判断,自己直接做判断就可以了
       2,传递参数的时候就可以传递安全访问参数,这个时候,参数的安全最高,无关乎post,get方法直接访问action啊,安全性就看你的验证多么强大了
       3,综上 两种方法没有什么区别,但是在代码量上,和移动端的开发上的量就不同了。不过是换个位置传参而已
    
    public function actions()
   {
     $actions = parent::actions();

    // 禁用"delete" 和 "create" 操作
    //unset($actions['view'], $actions['create'],$actions['update'],$actions['delete']);
    unset($actions['index'], $actions['update'], $actions['create'], $actions['delete'], $actions['view']);
    // 使用"prepareDataProvider()"方法自定义数据provider
    //$actions['index']['prepareDataProvider'] = [$this, 'prepareDataProvider'];
    return $actions;
   }
   public function actionCreate(){
         //还要返回这个学生可以活着已经填了那些表的信息 选择表的时候做判断。
         //教师的
        $name=\Yii::$app->request->post('name');
        $pwd=\Yii::$app->request->post('pwd');
        $studentnumber = \Yii::$app->request->post('studentnumber'); // 判断是否违法
        $model1 = new User();
        $exist = $model1->checkexist($studentnumber);
        if($exist == null)
            {return null;}
        else{
        $user=$model1->checkstudent($name,$pwd);
        if($user==null)
          {return $user=null;}
        return $user;
            }
    }

    这个是直接做判断的。url后面必须加到action 才可以访问。之后内部判断是否违法  

   第一个访问的时候到controller 就行了 但是记得要加S

  yii的基本的restful  参考 点击打开链接http://www.yiifans.com/forum.php?mod=viewthread&tid=2200

   做判断的时候建议用postman








1 0