loadsys / cakephp-stateless-auth
这是一个完全无状态的 CakePHP 认证/授权组件替代品。专为仅通过 REST 访问的 Cake 应用程序设计。
Requires
- php: >=5.4.0
- composer/installers: ~1.0
This package is not auto-updated.
Last update: 2024-09-14 16:55:39 UTC
README
这是一个完全无状态的 CakePHP 认证/授权组件替代品。专为仅通过 REST 访问的 Cake 应用程序设计。
提供的组件旨在替代 Cake 的标准 AuthCompnent
。这个替代的 StatelessAuthComponent
是一个简化版,默认在 HTTP 请求中查找 Authorization
头,并使用该头中的 Bearer [token]
值来填充 Auth->User()
。(这与标准 AuthComponent 默认操作不同,即使用浏览器提供的 cookie 在重复连接时查找来自活动 $_SESSION
的数据。)它支持可插拔的 Authenticate 和 Authorize 对象,并包含一些可能有用的对象。
⚠️ 这仍然是不稳定软件,可能还不适合公开使用。
需求
- PHP >= 5.4.0
- CakePHP >= 2.6
安装
Composer
- 运行以下 shell 命令
$ composer require loadsys/cakephp-stateless-auth:dev-master
设置
加载插件并确保 bootstrap 设置为 true
// Config/boostrap.php CakePlugin::load('StatelessAuth', array('bootstrap' => true)); // or CakePlugin::loadAll(array( 'StatelessAuth' => array('bootstrap' => true), ));
CakePHP 书籍中有更多关于如何使用 CakePHP 和此功能进行 REST API 的信息。
示例用法
在你的项目的 AppController
中,将你的 $components
数组更改为使用此插件的 StatelessAuthComponent,但使用别名允许按常见名称访问
public $components = array( 'Auth' => array( 'className' => 'StatelessAuth.StatelessAuth', 'authenticate' => array( 'className' => 'StatelessAuth.Token', // Additional examples: // 'userModel' => 'User', // 'tokenField' => 'token', // 'recursive' => -1, // 'contain' => array('Permission'), // 'conditions' => array('User.is_active' => true), // 'passwordHasher' => 'Blowfish', ), ), 'Paginator', 'DebugKit.Toolbar', );
你如何认证你的请求到 Cake 应用程序取决于你自己。如果你使用上面演示的捆绑的 TokenAuthenticate
对象,你必须在请求中包含一个 Authorization
头,该头包含一个与你的用户表中有效令牌匹配的 Bearer [token]
。令牌代表用户的登录会话,实际上替代了 $_SESSION
。一个示例 HTTP 请求可能如下所示
GET /users/view HTTP/1.1
Host: vagrant.dev:80
Authorization: Bearer 0193d044dd2034bfdeb1ffa33c5fff9b
⚠️ 正如正常的 Auth 一样,令牌将以明文形式发送,可能会被拦截和重用,因此请确保使用 SSL 保护你的连接。
TokenAuthenticate
将尝试使用提供的令牌查找用户记录。你可以在组件配置中定义要查询的用户模型名称和要检查的令牌字段名称,如上所示。
StatelessAuthComponent 默认使用此认证对象。
你仍然像平常一样在控制器中访问组件
/** * Allow the logged-in User to view their own record. * * @return void * @throws NotFoundException If the passed id record does not exist */ public function view() { $id = $this->Auth->user('id'); // <-- Populated by the stateless auth component. if (!$id) { throw new NotFoundException(__('Please log in to view your User record.')); } $options = array( 'conditions' => array( 'User.' . $this->User->primaryKey => $id, ), ); $user = $this->User->find('first', $options); $this->set(compact('user')); }
你必须在每个控制器或你的 AppController
中定义一个 ::isAuthorized($user)
方法,该方法返回 true 或 false,基于当前 Auth->user()
是否应该被允许访问当前控制器操作。
如果你希望所有认证用户都可以访问所有方法,你可以在你的项目 AppController 中放置以下内容
public function isAuthorized($user) { return true; }
或者,你可以提供自己的授权对象来自行执行适当的检查。有关详细信息,请参阅 Cake 的食谱部分关于 授权。
错误和异常处理设置
错误和异常通过一个单独的 CakePHP 插件处理,通过 Composer 包含: SerializersErrors
请阅读那里的文档以获取更多信息。
修改你的 app/Config/core.php
文件以使用 SerializersErrors 中的自定义异常/错误处理。
Configure::write('Exception', array( 'handler' => 'ErrorHandler::handleException', 'renderer' => 'SerializersErrors.SerializerExceptionRenderer', 'log' => true, ));
这做了两件事
- 错误和异常根据请求类型输出为正确格式化的 JSON API、JSON 或 HTML
- 允许使用与 Ember Data 异常匹配的自定义异常来处理错误情况
- 本插件中的类使用此格式以简化API身份验证处理的使用
交换身份验证和授权对象
项目包含额外的Auth对象,可用于扩展围绕HTTP头身份验证的功能。例如,TokenLoginLogoutAuthenticate
对象允许您将回调行为钩入到Auth->login()
和Auth->logout()
过程,以执行额外的模型操作。
请参阅Controller/Component/Auth/TokenLoginLogoutAuthenticate.php
,特别是::requireUserModelMethods()
以获取详细信息和方法签名。
@TODO:编写必要的回调方法的正确文档。
贡献
报告问题
请使用GitHub Issues列出任何已知的缺陷或问题。
开发
在开发此插件时,请进行分叉并发出PR以进行任何新开发。
可以通过此命令运行插件的完整测试套件
./lib/Cake/Console/cake test StatelessAuth AllStatelessAuth