yuido / apiauth-bundle
一个简化REST API保护的Bundle
Requires
- php: >=5.3.9
This package is not auto-updated.
Last update: 2024-09-18 21:01:23 UTC
README
ATENCIÓN!!!!!!!!!
Para completar este bundle falta por chequear las rutas para ver si
se cumplen los permisos especificados en las reglas de autorización.
Tal y como está ahora solo se usa la autenticación, es decir, solo
se comprueba si el usuario es quien dice ser y, en su caso, se permite
la ejecución de la operación
该Bundle的目的是提供一种简单的方法来通过令牌保护API,类似于OAuth2,但更加简单。
一旦将Bundle添加到项目中,所有请求都将被与TokenListener
类关联的监听器拦截,该监听器负责检查请求的路由是否受保护,进入该路由需要哪些角色,以及请求中的令牌是否与所需的角色关联。
另一方面,添加插件时,项目将添加以下操作来管理登录、注销和密码恢复过程
POST /rpc/login
{"username": "juanda", "password": "kakalaka"}
POST /rpc/logout
{"token": "llosiuwe8ejd7dk"}
POST /rpc/get_forgot_password_token
{"email": "juanda@yuido.com"}
POST /rpc/set_password
{"confirmation_token": "iisusuw7w7whshtsd6df",
"password": {"first": "kaka", "second": "kaka"} }
POST /rpc/set_user_password
{"token":"llosiuwe8ejd7dk", "oldPassword":"admin",
"password":{"first":"kaka","second":"kaka"}}
安装
yuido_api_auth:
user_class: AppBundle\Entity\User
group_class: AppBundle\Entity\Group
access_control:
- { path: ^/api, roles: ROLE_USER }
- { path: ^/api/users, roles: ROLE_ADMIN }
- { path: ^/rpc, roles: ROLE_USER }
保护API操作
每个RESTful或REST RPC类型的API操作都关联到一个路由,因此保护操作相当于保护路由。
该Bundle通过配置来保护路由。在config.yml
中添加:
yuido_api_auth:
access_control:
- { path: ^/api, roles: ROLE_USER }
- { path: ^/api/users, roles: ROLE_ADMIN }
- { path: ^/rpc, roles: ROLE_USER }
我们遵循了与Symfony2安全组件相同的配置语法,用于访问控制。在应用规则时,我们也遵循相同的逻辑,按照顺序遍历所有规则,并应用第一个与路由匹配的规则。
编码器
使用Sf2的安全组件。在security.yml
中
security:
encoders:
AppBundle\Entity\User: bcrypt
Bundle操作
登录
请求
POST /rpc/login
{"username": "juanda", "password": "kakalaka"}
响应
{"token":"578732cad981b",
"user": {
"id":21,
"firstname":"Juanda",
"lastname":"Rodríguez",
"username":"juanda",
"email":"juanda@yuido.com",
"role":"admin"
}
}
登录错误时返回statusCode = 401 (未授权)
此操作创建与用户关联的令牌并将其返回在响应中。
注销
请求: POST /rpc/logout {"token": "llosiuwe8ejd7dk"}
此操作删除与用户关联的令牌并返回空响应。
获取用于更改密码的确认令牌
此操作收集电子邮件地址,如果该地址已在系统中注册,则生成确认令牌并将包含该令牌的链接发送到提供的电子邮件地址。通过该链接,用户可以更改密码。
请求
POST /rpc/get_forgot_password_token
{"email": "juanda@yuido.com"}
响应
code 200
{"message":"Se le ha enviado un enlace para restablecer su direcci\u00f3n de correo"}
code 500
{"errors":{"email":["mensaje error 1","mensaje error 2"]}}
定义用户的密码
此操作定义请求密码恢复的用户密码。为此,需要在请求中发送确认令牌。
请求
POST /set_password/token=iisusuw7w7whshtsd6df
{"password": {"first": "kaka", "second": "kaka"} }
响应
code 200:
{"message":"password actualizado"}
code 500:
{"errors":["El token enviado no es v\u00e1lido"]}
更改用户密码
此操作允许更改与发送的令牌关联的用户的密码。
请求
POST /set_user_password
{"token":"llosiuwe8ejd7dk", "oldPassword":"admin",
"password":{"first":"kaka","second":"kaka"}}
响应
code: 200
{"message":"password actualizado"}
code: 500
{"errors":["mensaje de error 1", "mensaje de error 2"]}
User和Group实体
该Bundle将抽象的User
和Group
实体添加到项目中,这些实体基于fos_user Bundle。这些实体必须在项目中扩展并在Bundle配置中定义
yuido_api_auth: user_class: AppBundle\Entity\User group_class: AppBundle\Entity\Group
一个扩展User
类的示例
// AppBundle\Entity\User
<?php
namespace AppBundle\Entity;
use Yuido\ApiAuthBundle\Entity\User as BaseUser;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="yuido_users")
*/
class User extends BaseUser
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
protected $nuevoAtributo;
public function getNuevoAtributo(){
return $this->nuevoAtributo();
}
public setNuevoAtributo($a){
$this->nuevoAtributo = $a;
}
}
一个扩展Group类的示例
// AppBundle\Entity\Group
<?php
namespace AppBundle\Entity;
use Yuido\ApiAuthBundle\Entity\Group as BaseGroup;
use Doctrine\ORM\Mapping as ORM;
/**
* @ORM\Entity
* @ORM\Table(name="yuido_groups")
*/
class Group extends BaseGroup
{
/**
* @ORM\Id
* @ORM\Column(type="integer")
* @ORM\GeneratedValue(strategy="AUTO")
*/
protected $id;
protected $nuevoAtributo;
public function getNuevoAtributo(){
return $this->nuevoAtributo();
}
public setNuevoAtributo($a){
$this->nuevoAtributo = $a;
}
}