Yii2 Api认证和授权(翻译)
Authentication 认证
RESTful Api
是无状态的, 因此这意味着不能使用 sessions && cookies
。
因此每一个请求应该带有一些 authentication credentials
因为用户的 authentication
状态可能不是保存在 sessions || cookies
中的。
一个通用的实例就是在发送每一个请求的同时带一个 secret access token
来验证用户。因为一个 access token
可以用来确定一个唯一的用户和验证这个用户, API Requests
应该总是通过 https
协议来传输, 以防止 man-in-the-middle (MitM)
攻击。
有多种不同的方式来发送 access token
:
HTTP Basic Auth
access token
作为一个用户名被传递。这种情况只适合“当access token
可以安全的存储在API 接收端”的情况, 比如 调用 API 的是一个在服务器上运行的程序
- Query parameter
access token
在 API URL 中作为一个查询参数被传递,比如https://example.com/users?access-token=123456789
- 因为多数的 Web 服务器会保存 query 参数在服务器日志中, 这个方法应该主要是用于响应无法使用 HTTP 头部信息来发送
access token
的JSONP
请求的。
- OAuth 2
- 遵照
OAth2.0
协议, 调用者从一个授权服务器
上获取access token
, 再通过HTTP Bearer Tokens
发送给Api 服务器
。
- 遵照
Yii 支持上面的几种认证方式, 你也可以自己创建新的认证方法。
要对你的 APIs
启用认证的话, 遵照下面的步骤:
- 配置
user
组件的yii\web\User::enableSession|enableSession
属性为false
- 在你的 REST 控制器中 指明你准备使用哪一种
authenticator
方法 - 在你的
yii\web\User::identityClass|user identity class
中实施yii\web\IdentityInterface::findIdentityByAccessToken()
第一步并不是必须, 但是针对无状态的 RESTful APIs 还是建议要有。 当 yii\web\User::enableSession|enableSession
是 false
的时候, 用户认证状态不能通过 sessions
在多个请求之间保持。反倒是, 第二步和第三部的配置会对来的每一个请求都执行认证检查。
Tips: 你可以在应用的 configurations 的 user application component 中配置
yii\web\User::enableSession|enableSession
, 如果你是将 RESTful APIs 作为一个 模块 module, 你可以像下面一样在 module的 init() 方法中添加代码:
public function init()
{
parent::init();
\Yii::$app->user->enableSession = false;
}
下面针对上面几种情况,在 Yii2
的情况下举几个例子:
第一种情况, 使用 HTTP Basci Auth
use yii\helpers\ArrayHelper;
use yii\filters\auth\HttpBasicAuth;
public function behaviors()
{
return ArrayHelper::merge(
parent::behaviors(),[
'authenticator' => [
'class' => HttpBasicAuth::className(),
]
]
);
}
如果你想要使用上面讲到的 3 种方式, 可以像下面一样使用 CompositeAuth
:
use yii\helpers\ArrayHelper;
use yii\filters\auth\CompositeAuth;
use yii\filters\auth\HttpBasciAuth;
use yii\filters\auth\HttpBearerAuth;
use yii\filters\auth\QueryParamAuth;
public function behaviors()
{
return ArrayHelper::merge(parent::behaviors(), [
'authenticator' => [
#这个地方使用`ComopositeAuth` 混合认证
'class' => CompositeAuth::className(),
#`authMethods` 中的每一个元素都应该是 一种 认证方式的类或者一个 配置数组
'authMethods' => [
HttpBasicAuth::className(),
HttpBearerAuth::className(),
QueryParamAuth::className(),
]
]
]);
}
例如, 一个简单的情景是当每一个用户只能拥有一个 ·access token· 的时候, 你可以在 user
表中的 access_token
列存储它。这种方式可以像下面一样轻易的实现:
use yii\db\ActiveRecord;
use yii\web\IdentityInterface;
class User extends ActiveRecord implements IdentityInterface
{
public static function findIndentityByAccessToken($token)
{
return static::findOne(['access_token' => $token]);
}
}
经过上面的认证之后, 对每一个 API 请求, 被请求的 控制都会 在它的 beforeAction()
步骤之前尝试认证用户。
如果认证成功, 控制器会执行其他的检查,(比如rate limiting, authorization)。被认证了的用户的认证信息可以通过 Yii::$app->user->identity
获得。
如果认证失败, 一个 401 HTTP 状态的响应会被发送回来连同其他的头部信息 (比如一个 HTTP BASIC Auth 认证的 WWW-Authenticate
头部信息)
Authorization 授权
一个用户经过认证
之后, 你可能还想要检查他是否有对请求的资源执行某个请求动作的权限。这个过程叫做授权
授权是验证用户是否有足够权限做一些事情的过程。(译者注:Authentication就是验证是否注册,Authorization是检查已登录用户是否有权限) Yii 提供了两种方法来管理授权:
访问控制过滤器(Access Control Filter,简称 ACF)和 基于角色的访问控制(Role-Based Access Control,简称 RBAC)。
如果你的控制器 extend yii\rest\ActiveController
, 你可以覆盖重写 yii\rest\Controller::checkAccess()|checkAccess()
方法来执行授权检查。因为这个方法会被内建动作 yii\rest\ActiveController
调用。
Yii2 Api认证和授权(翻译)的更多相关文章
- Yii2.0 RESTful API 认证教程
认证介绍 和Web应用不同,RESTful APIs 通常是无状态的, 也就意味着不应使用 sessions 或 cookies, 因此每个请求应附带某种授权凭证,因为用户授权状态可能没通过 sess ...
- 【翻译】asp.net core2.1认证和授权解密
asp.net core2.1认证和授权解密 本篇文章翻译自:https://digitalmccullough.com/posts/aspnetcore-auth-system-demystifie ...
- Web Api 2 认证与授权 2
HTTP Message Handler 在 Web Api 2 认证与授权 中讲解了几种实现机制,本篇就详细讲解 Message Handler 的实现方式 关于 Message Handler 在 ...
- 关于 Web Api 2 认证与授权
认证与授权 认证与授权,Authentication and Authorize,这个是两个不同的事.认证是对访问身份进行确认,如验证用户名和密码,而授权是在认证之后,判断是否具有权限进行某操作,如 ...
- ASP.NET Core 3.0 一个 jwt 的轻量角色/用户、单个API控制的授权认证库
目录 说明 一.定义角色.API.用户 二.添加自定义事件 三.注入授权服务和中间件 三.如何设置API的授权 四.添加登录颁发 Token 五.部分说明 六.验证 说明 ASP.NET Core 3 ...
- .Netcore 2.0 Ocelot Api网关教程(5)- 认证和授权
本文介绍Ocelot中的认证和授权(通过IdentityServer4),本文只使用最简单的IdentityServer,不会对IdentityServer4进行过多讲解. 1.Identity Se ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(四)
在上一讲中,我们已经完成了一个完整的案例,在这个案例中,我们可以通过Angular单页面应用(SPA)进行登录,然后通过后端的Ocelot API网关整合IdentityServer4完成身份认证.在 ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(一)
好吧,这个题目我也想了很久,不知道如何用最简单的几个字来概括这篇文章,原本打算取名<Angular单页面应用基于Ocelot API网关与IdentityServer4+ASP.NET Iden ...
- Angular SPA基于Ocelot API网关与IdentityServer4的身份认证与授权(二)
上文已经介绍了Identity Service的实现过程.今天我们继续,实现一个简单的Weather API和一个基于Ocelot的API网关. 回顾 <Angular SPA基于Ocelot ...
随机推荐
- vue项目配置使用flow类型检查
你是否经常在debug那些简单可避免的bug?可能你给函数传参的时候搞错了参数的顺序,或者本来应该传个Number类型的参数,你传了一个String类型?JavaScript的弱类型是这一类bug的罪 ...
- http://my.oschina.net/lenglingx/blog/205269
http://my.oschina.net/lenglingx/blog/205269 http://www.2cto.com/os/201402/281465.html 单点登录原理: http:/ ...
- git中报unable to auto-detect email address
git commit 时报错: ** Please tell me who you are. Run git config --global user.email "you@example. ...
- Maven C盘用户文件下没有.m2
在配置好Maven的环境之后,先运行一条命令: mvn help:system 该命令会打印出所有的Java系统属性和环境变量. 运行这条命令的目的是让Maven执行一个真正的任务.可以从命令行上看到 ...
- Git学习笔记三--管理修改、撤销修改、删除文件
1.管理修改 什么是修改?比如你新增了一行,这就是一个修改,删除了一行,也是一个修改,更改了某些字符,也是一个修改,删了一些又加了一些,也是一个修改,甚至创建一个新文件,也算一个修改. 为什么说Git ...
- shader学习之路(1)- half lambert
在学习这个shader之前先提个经常使用概念.即光照模型.LightModel(光照模型)即是对于物体怎么对打在其上的光做出视觉反应的数学模型.意即表达物体对光反应产生的视觉效果与入射光.物体表面属性 ...
- 约瑟夫环 java实现
问题: N个人从1到N编号.围城一圈,从1開始报数, 数到X时,将X的编号输出,并将那个人踢出, 下一个从1再開始报数,直到全部人都出去 思路: 就是计数.移除,没有太深的思想,直接上代码: pack ...
- 【BIEE】服务启动失败,查看错误日志
Weblogic服务日志文件:------------------------------BI Managed Server:OBIEE_HOME\user_projects\domains\bifo ...
- 【VBA编程】01.第一个VBA程序Hello world
[程序1] 所有程序语言的开始都源于Hello world,那么我们也使用Hello world进行第一个VBA编程 新建Excle文件-----文件-------选项-----自定义功能区域---- ...
- JDBC数据库编程:ResultSet接口
掌握ResultSet接口 使用ResultSet接口进行查询 ResultSet接口 在JDBC操作中,数据库所有查询记录将使用ResultSet进行接收,并使用ResultSet显示内容. 常用方 ...