direktori cari
阅读前篇 简介 Yii 是什么 从 Yii 1.1 升级 入门 安装 Yii 运行应用 第一次问候 使用Forms 数据库应用 使用 Gii 生成代码 进阶 应用结构 概述 入口脚本 应用(Applications) 应用组件(Application Components) 控制器(Controllers) 模型(Models) 视图(views) 模块(Modules) 过滤器(Filters) 小部件(Widgets) 前端资源(Assets) 扩展(Extensions) 请求处理 运行概述 启动引导(Bootstrapping) 路由和创建URL 请求(Requests) 响应(Responses) Sessions 和 Cookies 错误处理(Handling Errors) 日志(Logging) 关键概念 组件(Component) 属性(Property) 事件(Events) 行为(Behaviors) 配置(Configurations) 别名(Aliases) 类自动加载(Autoloading) 服务定位器(Service Locator) 依赖注入容器(Dependency Injection Container) 配合数据库工作 数据库访问 (Data Access Objects) 查询生成器(Query Builder) 活动记录(Active Record) 数据库迁移(Migrations) Sphinx Redis MongoDB Elasticsearch 接收用户数据 创建表单(Creating Forms) 输入验证(Validating Input) 文件上传(Uploading Files) 收集列表输入(Collecting Tabular Input) 多模型的复合表单(Getting Data for Multiple Models) 显示数据 格式化输出数据(Data Formatting) 分页(Pagination) 排序(Sorting) 数据提供器(Data Providers) 数据小部件(Data Widgets) 客户端脚本使用(Working with Client Scripts) 主题(Theming) 安全 认证(Authentication) 授权(Authorization) 处理密码(Working with Passwords) 客户端认证(Auth Clients) 最佳安全实践(Best Practices) 缓存 概述 数据缓存 片段缓存 页面缓存 HTTP 缓存 RESTfull Web服务 快速入门(Quick Start) 资源(Resources) 控制器(Controllers) 路由(Routing) 格式化响应(Response Formatting) 授权认证(Authentication) 速率限制(Rate Limiting) 版本(Versioning) 错误处理(Error Handling) 开发工具 调试工具栏和调试器 使用Gii生成代码 生成API文档 测试 概述(Overview) 配置测试环境(Testing environment setup) 单元测试(Unit Tests) 功能测试(Function Tests) 验收测试(Acceptance Tests) 测试夹具(Fixtures) 高级专题 高级应用模板 创建自定义应用程序结构 控制台命令 核心验证器(Core Validators) 国际化 收发邮件 性能优化 共享主机环境 模板引擎 集成第三方代码 小部件 Bootstrap 小部件 Jquery UI 助手类 概述 Array 助手(ArrayHelper) Html 助手(Html) Url 助手(Url)
watak

授权认证

认证

和Web应用不同,RESTful APIs 通常是无状态的,也就意味着不应使用sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过sessions 或 cookies维护, 常用的做法是每个请求都发送一个秘密的access token来认证用户,由于access token可以唯一识别和认证用户, API 请求应通过HTTPS来防止man-in-the-middle (MitM) 中间人攻击.

下面有几种方式来发送access token:

  • HTTP 基本认证: access token 当作用户名发送,应用在access token可安全存在API使用端的场景,例如,API使用端是运行在一台服务器上的程序。
  • 请求参数: access token 当作API URL请求参数发送,例如 https://example.com/users?access-token=xxxxxxxx,由于大多数服务器都会保存请求参数到日志, 这种方式应主要用于JSONP 请求,因为它不能使用HTTP头来发送access token
  • OAuth 2: 使用者从认证服务器上获取基于OAuth2协议的access token,然后通过 HTTP Bearer Tokens 发送到API 服务器。

Yii 支持上述的认证方式,你也可很方便的创建新的认证方式。

为你的APIs启用认证,做以下步骤:

  1. 配置user 应用组件:
    • 设置 yii\web\User::enableSession 属性为 false.
    • 设置 yii\web\User::loginUrl 属性为null 显示一个HTTP 403 错误而不是跳转到登录界面.
  2. 在你的REST 控制器类中配置authenticator 行为来指定使用哪种认证方式
  3. 在你的yii\web\User::identityClass 类中实现 yii\web\IdentityInterface::findIdentityByAccessToken() 方法.

步骤1不是必要的,但是推荐配置,因为RESTful APIs应为无状态的,当yii\web\User::enableSession为false, 请求中的用户认证状态就不能通过session来保持,每个请求的认证通过步骤2和3来实现。

提示: 如果你将RESTful APIs作为应用开发,可以设置应用配置中 user 组件的yii\web\User::enableSession, 如果将RESTful APIs作为模块开发,可以在模块的 init() 方法中增加如下代码,如下所示:

public function init(){
    parent::init();
    \Yii::$app->user->enableSession = false;
}

例如,为使用HTTP Basic Auth,可配置authenticator 行为,如下所示:

use yii\filters\auth\HttpBasicAuth;

public function behaviors(){
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => HttpBasicAuth::className(),
    ];
    return $behaviors;
}

如果你系那个支持以上3个认证方式,可以使用CompositeAuth,如下所示:

use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasicAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;

public function behaviors(){
    $behaviors = parent::behaviors();
    $behaviors['authenticator'] = [
        'class' => CompositeAuth::className(),
        'authMethods' => [
            HttpBasicAuth::className(),
            HttpBearerAuth::className(),
            QueryParamAuth::className(),
        ],
    ];
    return $behaviors;
}

authMethods 中每个单元应为一个认证方法名或配置数组。

findIdentityByAccessToken()方法的实现是系统定义的, 例如,一个简单的场景,当每个用户只有一个access token, 可存储access token 到user表的access_token列中, 方法可在User类中简单实现,如下所示:

use yii\db\ActiveRecord;
use yii\web\IdentityInterface;

class User extends ActiveRecord implements IdentityInterface{
    public static function findIdentityByAccessToken($token, $type = null)
    {
        return static::findOne(['access_token' => $token]);
    }
}

在上述认证启用后,对于每个API请求,请求控制器都会在它的beforeAction()步骤中对用户进行认证。

如果认证成功,控制器再执行其他检查(如频率限制,操作权限),然后再执行操作, 授权用户信息可使用Yii::$app->user->identity获取.

如果认证失败,会发送一个HTTP状态码为401的响应,并带有其他相关信息头(如HTTP 基本认证会有WWW-Authenticate 头信息).

授权

在用户认证成功后,你可能想要检查他是否有权限执行对应的操作来获取资源,这个过程称为 authorization , 详情请参考 Authorization section.

如果你的控制器从yii\rest\ActiveController类继承,可覆盖 yii\rest\Controller::checkAccess() 方法 来执行授权检查,该方法会被yii\rest\ActiveController内置的操作调用。
Artikel sebelumnya: Artikel seterusnya: