----------------------------------------------------------

1、restfull api部分

注:笔记,自己摸索出来的,路子野,仅供参考。

----------------------- 欢迎指教交流。。。

<?php
// BaseController.php namespace AppBundle\Controller; use Symfony\Bundle\FrameworkBundle\Controller\Controller; class BaseController extends Controller
{
protected static $method_type = array('get', 'post', 'put', 'patch', 'delete'); /**
* description: 负责restfull api调派
* @param {request obj,class||obj,[array],string}
* @return: array
*/
public static function restfullDispatch(Request $request,$obj,$params=null,$resouce=null){
$resouce = $resouce ? $resouce:explode('Action',explode('Controller::',$request->get('_controller'))[1])[0];
$method = strtolower($request->server->get('REQUEST_METHOD'));
if (in_array($method, self::$method_type)) {
//调用请求方式对应的方法
$method_name = $method . ucfirst($resouce);
if(!method_exists($obj,$method_name)){
throw new Exception('The method: '.$method_name.' not exists!');
}
return $obj->$method_name($params);
}
return false;
} }

然后所有controller继承BaseController,Action调$this::restfullDispatch() 就行了,最后路由可以设置成类似:

get /admin/user

post /admin/user

put /admin/user

patch /admin/user

……

2、权限控制部分

其实也很简单,由于开始时没有认真看框架的 事件监听 部分的文档,摸索了很久。。。这里做个记录。

简单总结为以下几个步骤:

1、securty.yml里配置好角色继承关系

security:

    #···

    #分层角色
role_hierarchy:
ROLE_ADMIN: ROLE_USER
ROLE_SUPER_ADMIN: ROLE_ADMIN
^ROLE_CUSTOM_: ROLE_USER #自定义角色需继承ROLE_USER才能登录,没错可以用正则,棒棒的

2、数据库里建立RBAC关系表(这部分基本和别的框架一样)

数据库大概是这个样子:

角色表

权限表表

用户表里面有一个role字段,值为角色表里的一条记录的name,就不截图了

3、监听kener.controller事件,根据role的验证权限,根据验证结果setController

<?php

namespace AppBundle\EventListener;

use Symfony\Component\HttpFoundation\Response;
// use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
// use Symfony\Component\HttpKernel\Exception\HttpExceptionInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\DependencyInjection\ContainerInterface; use AppBundle\System\Status;
use AppBundle\Entity\Users;
use AppBundle\Entity\Roles; /**
* 侦听系统的kernel.controller事件,通过actionName实现权限控制
*/
class RunActionListenter
{
protected $controllerConfig = array('Admin'); //需要进行权限控制的controller
protected $em;
protected $tokenStorage;
protected $result = array(
'code' => Status::ALL['PERMISSION_DENIED'][0],
'msg' => Status::ALL['PERMISSION_DENIED'][1],
'data' => null,
); public function __construct(TokenStorageInterface $tokenStorage,ContainerInterface $container){
$this->tokenStorage = $tokenStorage;
$this->em = $container->get('doctrine')->getManager();
} public function onKernelController(FilterControllerEvent $event){
if(! $event->isMasterRequest()){
return;
}
$request = $event->getRequest();
$isAjax = $request->isXmlHttpRequest();
$method = strtolower($request->server->get('REQUEST_METHOD')); $controller = explode('Controller::',$request->get('_controller'));
$controllerName = substr($controller[0],21); if(in_array($controllerName,$this->controllerConfig)){
$user = $this->tokenStorage->getToken()->getUser();
//超级管理员只做登录验证,此角色可以为所欲为,并且不能通过系统的权限管理分配到此角色
if(! $user->hasRole('ROLE_SUPER_ADMIN')){
$actionName = $method.ucfirst(explode('Action',$controller[1])[0]);
$userRole = $user->getRoles()[0];
$privileges = $this->em->getRepository(Roles::class)
->findOneBy(array('name'=>$userRole))->getPrivileges();
// $privilegeId = $this->em->getRepository('AppBundle\Entity\privileges')
// ->findOneBy(array('actionName'=>$actionName))->getId(); if(!in_array($actionName,$privileges)){
$this->result['msg'] = $this->result['msg'].',你当前的职位还需要权限:'.$actionName.'才能继续访问,请【联系管理员授权】!';
$controller = $event->getController()[0];
$event->setController(function() use ($isAjax){
if($isAjax){
return new Response(
json_encode($this->result,true),
200,
array('Content-Type' => 'application/json')
);
}else{
return new Response('<h4>'.$this->result['msg'].'</h4>');
} });
}
} } } }

然后别忘了按照文档说的在service.yml里把它写进去

-----------over。。。

------------------------------------------------------------------------

symfony里实现resfull api并实现权限控制的更多相关文章

  1. 在ASP.NET MVC里对Web Page网页进行权限控制

    我们在ASP.NET MVC开发时,有时候还是得设计ASP.NET的Web Page网页(.aspx和.aspx.cs),来实现一些ASP.NET MVC无法实现的功能,如此篇<Visual S ...

  2. 基于RESTful API 设计用户权限控制

    RESTful简述 本文是基于RESTful描述的,需要你对这个有初步的了解. RESTful是什么? Representational State Transfer,简称REST,是Roy Fiel ...

  3. Android开发-API指南-系统权限

    System Permissions 英文原文:http://developer.android.com/guide/topics/security/permissions.html 采集日期:201 ...

  4. API权限控制与安全管理

     摘自网上 一.API权限控制范围 1.首先验证web端请求参数: (1)web请求参数:渠道.ServiceName.版本.Airline.时间戳(yyyyMMddhhmmssSSS).reqXML ...

  5. Spring Boot 之 RESRful API 权限控制

    摘要: 原创出处:www.bysocket.com 泥瓦匠BYSocket 希望转载,保留摘要,谢谢! “简单,踏实~ 读书写字放屁” 一.为何用RESTful API 1.1 RESTful是什么? ...

  6. 认证鉴权与API权限控制在微服务架构中的设计与实现(四)

    引言: 本文系<认证鉴权与API权限控制在微服务架构中的设计与实现>系列的完结篇,前面三篇已经将认证鉴权与API权限控制的流程和主要细节讲解完.本文比较长,对这个系列进行收尾,主要内容包括 ...

  7. Expo大作战(三十)--expo sdk api之Permissions(权限管理模块),Pedometer(计步器api)

    简要:本系列文章讲会对expo进行全面的介绍,本人从2017年6月份接触expo以来,对expo的研究断断续续,一路走来将近10个月,废话不多说,接下来你看到内容,讲全部来与官网 我猜去全部机翻+个人 ...

  8. 基于RESTful API 怎么设计用户权限控制?

    前言 有人说,每个人都是平等的:也有人说,人生来就是不平等的:在人类社会中,并没有绝对的公平,一件事,并不是所有人都能去做:一样物,并不是所有人都能够拥有.每个人都有自己的角色,每种角色都有对某种资源 ...

  9. 【微服务】之七:轻松搞定SpringCloud微服务-API权限控制

    权限控制,是一个系统当中必须的重要功能.张三只能访问输入张三的特定功能,李四不能访问属于赵六的特定菜单.这就要求对整个体系做一个完善的权限控制体系.该体系应该具备针区分用户.权限.角色等各种必须的功能 ...

  10. gin-jwt对API进行权限控制

    前言 之前文章简单介绍了如何运行gin+vue的前后端分离开源项目,该项目是学习了Gin实践教程后结合vue-element-admin写的,该教程讲得很详细,适合入门Gin.本篇文章将介绍gin+v ...

随机推荐

  1. 通过串口通信 对TCP传输层以下的理解

    这可能是近期暂时最后一篇c嵌入式的文章了 基础的串口使用 参照网上的stm32教程套路引入标准库,初始化芯片手册上对应串口引脚 ,初始化stm32串口功能,然后有数据了就自然在寄存器上,就这样,你的波 ...

  2. Git 忽略文件配置全解析

    Git 忽略文件配置全解析 在Git版本控制系统中,.gitignore文件扮演着至关重要的角色.它允许我们指定哪些文件或目录应该被Git忽略,即不被纳入版本控制之中.这对于避免提交敏感信息.构建产物 ...

  3. Iceberg问题记录-数据湖问题记录跟进

    一.问题追踪 问题 详细描述 提出问题时间 是否完成 计划完成时间 备注 了解Iceberg数据存储方式 了解元数据存储信息.数据组织方式.查询时处理流程等 20231013 是 20231019 ! ...

  4. Luogu P1784 数独 [ 模板 ] / P1074 靶形数独 题解 [ 蓝 ] [ 深搜 ] [ 剪枝 ] [ 卡常 ]

    数独模板 , 靶形数独 卡了 2h ,再也不想写数独了. 普通数独 思路 显然是对每个格子进行枚举,类似八皇后的方法去做,朴素方法是由 \((1,1)\) 到 \((9,9)\) 遍历过去. 优化 我 ...

  5. 腾讯ima接入deepseek-r1,借用别人脑子用用成真了~

    大家好,我是汤师爷! 最近,腾讯发布了一款ima产品,主打用AI来帮你搜索信息.管理知识库. 说实话,一开始用混元大模型,感觉不咋地,很鸡肋的. 不过最近腾讯把DeepSeek R1接进来了,一下子解 ...

  6. 你好,新朋友:生成式AI的第一次对话

    像学习使用智能手机一样开启AI对话 一.从"第一次用智能手机"理解AI交互 还记得初次使用智能手机时的笨拙吗?滑动解锁.输入文字.下载应用-每一步都需要探索.生成式AI的对话也遵循 ...

  7. 大模型知识引擎 LKE 新手入门指南:官方文档难懂?看这篇就够了

    昨天简单体验了一下大模型知识引擎(LKE),总体来说,虽然其功能方面还有一定欠缺,但在一些特定领域,特别是RAG(Retrieval-Augmented Generation)技术的应用上,还是表现出 ...

  8. Qt修改exe文件图标

    修改Qt生成exe的图标以及软件标题图标 目录 修改Qt生成exe的图标以及软件标题图标 简介 QtCreator下添加exe图标 直接添加.ico 通过.rc文件修改 Visual Studio下添 ...

  9. rust学习笔记(4)

    流程控制 if if n < 0 { print!("{} is negative", n); } else if n > 0 { print!("{} is ...

  10. mysql - 视图的操作 创建,修改,删除,查看

    只保存sql逻辑,不保存查询结果 视图可以看作是封装了多条sql语句,之后使用的时候就像普通表一样,而这个表上的字段则是创建视图时,select 后边跟的字段,支持列的别名. 创建 语法: creat ...