yii2 api认证与授权

一、API认证的实现:可以让用户在客户端进行登录认证

步骤1:api/config/main.php  去掉cookie,session,将common\models\user改为common\models\Adminuser,增加'enableSession' => false,去掉identityCookie及session设置

return[
	'components'=>[
		'user' => [
			'identityClass' => 'common\models\Adminuser',
			'enableAutoLogin' => true,
			'enableSession' => false,
			//'identityCookie' => ['name' => '_identity-backend', 'httpOnly' =>true]
		],
		//'session' => [
			//'name' =>'advaced-backend',
		//]
	]


]

步骤2: 获得AccessToken
A、准备好需要用到的文件
包括认证类Adminuser文件(复制common/models/user.php为common/models/Adminuser.php),在代码底部加上以下代码:

public function generateAccessToken(){
	$this->access_token = Yii::$app->security->generateRandomString();
	return $this->access_token;
}


控制器文件,命名为AdminuserController,实现了登录的末端,规定了总体的登录流程

namespace api\controllers;

use yii\rest\ActiveController;
use yii\data\ActiveDataProvider;
use api\models\ApiLoginForm;

class AdminuserController extends ActiveController{
	public $modelClass= 'common\models\Adminuser';

	public function actionLgoin(){
		$mode =new ApiLoginForm();

		$model->username = $_POST['username'];
		$model->password = $_POST['password'];

		if($model->login()){
			return['access_token'=>$model->login()];
		}else{
			$model->validate();
			return $model;
		}
	}
}


后台用到的登录表单模型类ApiLoginForm(复制common/models/(Admin)LoginForm.php到api/models/apiLoginForm.php),修改login()函数
 

<?php
namespace api\models;

use Yii;
use yii\base\Model;
use common\models|Adminuser;

/**
 * Login form
 */
class AdminLoginForm extends Model
{
    public $username;
    public $password;


    private $_user;


    /**
     * {@inheritdoc}
     */
    public function rules()
    {
        return [
            // username and password are both required
            [['username', 'password'], 'required'],
            // password is validated by validatePassword()
            ['password', 'validatePassword'],
        ];
    }

    /**
     * Validates the password.
     * This method serves as the inline validation for password.
     *
     * @param string $attribute the attribute currently being validated
     * @param array $params the additional name-value pairs given in the rule
     */
    public function validatePassword($attribute, $params)
    {
        if (!$this->hasErrors()) {
            $user = $this->getUser();
            if (!$user || !$user->validatePassword($this->password)) {
                $this->addError($attribute, 'Incorrect username or password.');
            }
        }
    }

    /**
     * Logs in a user using the provided username and password.
     *
     * @return bool whether the user is logged in successfully
     */
    public function login()
    {
        if ($this->validate()) {
            //return Yii::$app->user->login($this->getUser(), $this->rememberMe ? 3600 * 24 * 30 : 0);
        	$accessToken = $this->_user->generateAccessToken();
        	$this->_user->save();
        	return $accessToken
        }
        
        return false;
    }

    /**
     * Finds user by [[username]]
     *
     * @return User|null
     */
    protected function getUser()
    {
        if ($this->_user === null) {
            $this->_user = User::findByUsername($this->username);
        }

        return $this->_user;
    }
}

B、客户端测试AccessToken

添加url美化规则

['class'=>'yii\rest\UrlRule',
	'controller'=>'adminuser',
	'except'=>['delete','create','update','view'],
	'pluralize'=>false,
	'extraPatterns'=>[
		'POST login' => 'login',
	],
],

小程序客户端

bindLoginTap: function(){
	var page =this;
	wx.request({
		usrl: 'http://api.apitpl.dev/adminuser/login',
		header:{
			'Content-Type':'application/x-www-form-urlencoded'
		}
		method:'POST',
		data:{
			username:"weixi",
			password:"123456"
		},
		success:function(res){
			console.log(res.data)
		}
	})
}


二、认证状态的维持:认证成功后,客户端调用服务端的API程序时,能保持认证状态。

A、api/controllers/ArticleController.php添加QueryParamAuth过滤器

public function behaviors(){
	return ArrayHelper::merge(parent::behaviors(),[
		'authenticatior' => [
			'class' => QueryParamAuth::className()
		]
	]);
}

B、common/models/Adminuser.php修改以下代码

public static function findIdentityByAccessToken($token, $type = null){
	return static::findOne(['access_token'=>$token]);
}

C、客户端代码

bindAuthReadTap: function(){
	var page =this;
	wx.request({
		usrl: 'http://api.apitpl.dev/articles?access-token=jkfa78676899766sdf',
		header:{
			'Content-Type':'application/json'
		}
		method:'GET',
		data:{
			page:1
		},
		success:function(res){
			page.setData({motto:res.data.content})
			console.log(res.data)
		}
	})
}

D、

认证类:adminuser,user,或单独建认证类
认证方式:1)请求参数:用QueryParamAuth过滤器来实现认证  2)HTTP基本认证:HTTP规范中所制定的最基本的认证方式  3) OAuth2:是一种为用户授权提供的、安全的、开放和简易的协议。
安全问题:用https来访问服务端,给令牌增加访问过期时间,http动词避免使用get而是用POST


三、API的授权:能根据RBAC的授权数据,检查发出API请求的客户端用户是否有权执行他请求的功能

1、安装yii2-admin:插件是一个配合yii2的rbac组件进行可视化管理工具
2、实现后台入口的授权功能:用yii2-admin插件实现后台应用的RBAC授权功能,在后台建立授权数据。
3、实现API应用的授权:实现API应用的RBAC授权功能,API应用共享后台应用生成的授权数据。


四、用户注册:完成注册的接口程序,让游客能在API客户端注册成为用户。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Yii2进行API接口开发的RBAC实例: 1.首先,您需要安装Yii2框架并创建一个新的Yii2应用程序。 2.然后,您需要安装Yii2的RBAC扩展。您可以通过在终端中运行以下命令来完成此操作: ```shell composer require "yiisoft/yii2-rbac:*" ``` 3.接下来,您需要配置您的应用程序以使用RBAC扩展。您可以在您的应用程序配置文件中添加以下内容: ```php 'components' => [ 'authManager' => [ 'class' => 'yii\rbac\DbManager', ], ], ``` 4.然后,您需要创建RBAC权限和角色。您可以在控制台中运行以下命令来完成此操作: ```shell ./yii rbac/init ``` 5.接下来,您需要创建一个控制器来处理API请求。您可以使用以下代码作为示例: ```php namespace app\controllers; use yii\rest\ActiveController; use yii\filters\auth\HttpBearerAuth; class PostController extends ActiveController { public $modelClass = 'app\models\Post'; public function behaviors() { $behaviors = parent::behaviors(); $behaviors['authenticator'] = [ 'class' => HttpBearerAuth::className(), ]; return $behaviors; } public function checkAccess($action, $model = null, $params = []) { if ($action === 'create' || $action === 'update' || $action === 'delete') { if (!\Yii::$app->user->can('managePosts')) { throw new \yii\web\ForbiddenHttpException('You are not allowed to perform this action.'); } } } } ``` 6.最后,您需要定义RBAC权限和角色。您可以使用以下代码作为示例: ```php $auth = Yii::$app->authManager; // 添加 "managePosts" 权限 $managePosts = $auth->createPermission('managePosts'); $managePosts->description = 'Manage posts'; $auth->add($managePosts); // 添加 "admin" 角色并赋予 "managePosts" 权限 $admin = $auth->createRole('admin'); $auth->add($admin); $auth->addChild($admin, $managePosts); // 将 "admin" 角色分配给用户 $auth->assign($admin, 1); ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值