hirschen/rest

安装: 153

依赖: 0

建议者: 0

安全: 0

星星: 0

Forks: 0

类型:symfony-bundle

dev-master 2020-10-30 11:34 UTC

This package is not auto-updated.

Last update: 2024-09-24 16:07:59 UTC


README

此软件包提供认证(JWT)、序列化、验证、参数转换等功能。此外,还定义了几个常量、辅助类和服务,以支持构建标准化的Rest API。异常通过监听器捕获并序列化为JSON响应。

配置Symfony Bundle

https://symfony.com.cn/doc/current/bundles/best_practices.html

了解更多关于Symfony的朋友

FOS User
https://github.com/FriendsOfSymfony/FOSUserBundle/blob/master/Resources/doc/index.rst
FOS REST
https://symfony.com.cn/doc/current/bundles/FOSRestBundle/index.html

了解更多关于Lexik (JWT Management)

https://github.com/markitosgv/JWTRefreshTokenBundle

安装

composer require hirschen/rest

将bundle添加到bundles.php

<?php

return [
    ...
    Hirschen\Rest\HirschenRestBundle::class => ['all' => true],
    ...
];

创建私钥和公钥,并在.env中引用它们

###> lexik/jwt-authentication-bundle ###
JWT_SECRET_KEY=%kernel.project_dir%/config/jwt/private.pem
JWT_PUBLIC_KEY=%kernel.project_dir%/config/jwt/public.pem
JWT_PASSPHRASE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

将刷新路由添加到routes.yml

gesdinet_jwt_refresh_token:
  path:       /api/auth/refresh
  controller: gesdinet.jwtrefreshtoken::refresh

将Hirschen/Rest序列化服务添加到services.yml

    Hirschen\Rest\Service\ParamConverter\SerializerService:
        autowire: false
        public: true
        arguments:
            - "@fos_rest.serializer"
            - "@fos_rest.validator"
            - "validationErrors"
            - "@doctrine_mongodb.odm.document_manager"
            - '@Hirschen\Rest\Service\User\UserService'

在config/packages

在gesdinet_jwt_refresh_token.yaml

    gesdinet_jwt_refresh_token:
        user_provider: fos_user.user_provider.username_email
        object_manager: doctrine_mongodb.odm.document_manager
        ttl_update: true
        manager_type: mongodb
在lexik_jwt_authentication.yaml(链接环境变量)
    lexik_jwt_authentication:
      secret_key:       '%env(resolve:JWT_SECRET_KEY)%' # required for token creation
      public_key:       '%env(resolve:JWT_PUBLIC_KEY)%'  # required for token verification
      pass_phrase:      '%env(resolve:JWT_PASSPHRASE)%' # required for token creation, usage of an environment variable is recommended
      token_ttl:        5184000 # 60 days
      user_identity_field: email

在security.yaml

  • 添加编码器和提供者
  • 为需要受保护的路线添加守卫
  • 添加登录路由
security:
  encoders:
    FOS\UserBundle\Model\UserInterface: bcrypt

  providers:
    fos_userbundle:
      id: fos_user.user_provider.username_email

    ...
    ...

    api:
      pattern:   ^/api
      stateless: true
      provider: fos_userbundle
      guard:
        authenticators:
          - lexik_jwt_authentication.jwt_token_authenticator

    ...
    ...

    login:
      pattern: ^/api/login
      stateless: true
      anonymous: true
      logout: true
      provider: fos_userbundle
      form_login:
        check_path:               /api/login
        success_handler:          user.authentication_success_handler
        failure_handler:          lexik_jwt_authentication.handler.authentication_failure
        require_previous_session: false
        username_parameter: email
        password_parameter: password

在fos_rest.yaml中添加异常控制器

# Read the documentation: https://symfony.com.cn/doc/master/bundles/FOSRestBundle/index.html
fos_rest:
  body_listener: true
  body_converter:
    enabled: true
    validate: true
    validation_errors_argument: validationErrors
  format_listener:
    rules:
      - { path: '^/', priorities: ['json'], fallback_format: json, prefer_extension: false }
  param_fetcher_listener: true
  exception:
    enabled: true
    exception_controller: 'Hirschen\Rest\Controller\ExceptionController::showAction'
  view:
    view_response_listener: 'force'
    formats:
      json: true

验证的序列化和参数转换

摘要(如何工作)

  1. JSON请求序列化为PHP对象
  2. 对象被验证 https://symfony.com.cn/doc/current/validation.html#constraint-configuration
  3. 如果对象是文档(ODM)并且已设置主键(通常为id),则进行到4,否则跳到5。
  4. 从数据库获取现有文档并与其给定输入同步。将获取的(更新后的)文档传递到5。
  5. 将对象添加到控制器操作的参数中

以下注解触发了上述功能

use Hirschen\Rest\Annotation\Parameter;
...

class UserController extends BaseController
{

/**
 * @Rest\Post("/create", name="admin_user_create")
 * @Parameter("user", {"Group 1","Group 2"})
 */
 public function x(User $user...): Response
...

Parameter注解的第一个参数是必需的,以便将其映射到控制器函数的参数。在这种情况下,“user”映射到$user。第二个参数是字符串数组,包含必要的组,以确定此软件包执行的序列化和验证的范围。通过在控制器操作中对参数进行类型提示,序列化器识别对象类型。

当控制器操作开始时,JSON已经被序列化和验证($user)。如果$user是新的文档,则它已准备好持久化。如果是现有文档,则已获取、更新并将旧文档设置为$user。

通过使用组标记对象或文档的属性,Parameter注解可以确定序列化和自定义验证的正确范围。

    /**
     * @Assert\NotBlank(groups={"Group 2", "Group 3"})
     * @Groups({"Group 1","Group 2", "Group 3","Group 4" })
     * @Serializer\Type("string")
     */
    protected $attribute;