- 浏览: 1780094 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (641)
- vb2005xu自己动手系列 (174)
- vb2005xu开发文章转摘 (47)
- vb2005xu发发牢骚 (99)
- vb2005xu新技术灌水 (12)
- vb2005xu网络资源集锦 (21)
- vb2005xu软件学习 (60)
- 英语学习 (3)
- JavaScript 学习 (54)
- JAVA OOP 巩固 之 CustomDatabase 的开发 (5)
- 2013年9月之前所在公司 记事 (7)
- FleaPHP/QEEPHP 资料 (87)
- JAVA MAIL 学习篇 (4)
- Python turbogears (5)
- Rails 个人开发四部曲 (3)
- 名人传 (8)
- iwp framework (5)
- 高考零分作文 (5)
- startos (8)
- lua (0)
- 职场 (1)
最新评论
-
hellotieye:
自己 评论 自己 挺嗨呀
Mysql sql查询时 if 的用法 -
igevin:
转载请标明出处,转自Gevin的博客http://blog.i ...
RESTful API 编写指南 -
Theobob:
...
实现简单的ACL -
vb2005xu:
比如 对于 curl 调用就不再需要 加各种if 判断了,
$ ...
搞一个简单的数据打印工具AsDebug の Laravel -
vb2005xu:
http://geekplux.com/wiki/
YII2 模块内自定义错误页
终于写完了 呵呵 简单的一个实现
-- ACL Tables -- 表的结构 `aclresources` DROP TABLE IF EXISTS `aclresources`; CREATE TABLE IF NOT EXISTS `aclresources` ( `rsid` varchar(64) NOT NULL , `access` int(4) NOT NULL default 0, `desc` varchar(240) NOT NULL default '', `created_at` int(10) unsigned NOT NULL default 1, `updated_at` int(10) unsigned NOT NULL default 0, PRIMARY KEY (`rsid`) )DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- 表的结构 `aclroles` DROP TABLE IF EXISTS `aclroles`; CREATE TABLE IF NOT EXISTS `aclroles` ( `id` int(10) unsigned NOT NULL auto_increment, `rolename` varchar(32) NOT NULL , `durces_aclroles` ( `rsid` varchar(64) NOT NULL , `role_id` int(10) unsigned NOT NULL , PRIMARY KEY (`rsid`,`role_id`) )DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- 表的结构 `ref_users_aclroles` DROP TABLE IF EXISTS `ref_users_aclroles`; CREATE TABLE IF NOT EXISTS `ref_users_aclroles` ( `user_id` int(10) unsigned NOT NULL auto_increment, `role_id` int(10) unsigned NOT NULL , PRIMARY KEY (`user_id`,`role_id`) )DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci; -- 表的结构 `users` DROP TABLE IF EXISTS `users`; CREATE TABLE `users` ( `id` int(10) unsigned NOT NULL auto_increment, `email` varchar(128) NOT NULL, `password` varchar(64) NOT NULL, `nickname` varchar(32) NOT NULL default '', `roles` varchar(240) NOT NULL default '', `created_at` int(10) unsigned NOT NULL default 1, `updated_at` int(10) unsigned NOT NULL default 0, PRIMARY KEY (`id`), UNIQUE KEY `user_email` (`email`) )DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
php 类
<?php /** * 简单的 ACL 权限控制功能 * * 表定义 * * 1. 资源定义 (rsid,access,desc,created_at,updated_at) * 2. 角色定义 (id,rolename,desc,created_at,updated_at) * 3. 资源-角色关联 (rsid,role_id) * 4. 用户-角色关联 (user_id,role_id) * * 依赖db.php sqlobject.php * * @author vb2005xu.iteye.com */ class AclBase { // --- ACL 访问授权 /** * 不允许任何人访问 */ const NOBODY = 0; /** * 允许任何人访问 */ const EVERYONE = 1; /** * 允许 拥有角色的用户访问 */ const HAS_ROLE = 2; /** * 允许 不带有角色的用户访问 */ const NO_ROLE = 3; /** * 在 资源-角色关联 定义的 角色才能访问 */ const ALLOCATE_ROLES = 4; // 定义相关的 表名 public $tbResources = 'aclresources'; public $tbRoles = 'aclroles'; public $tbRefResourcesRoles = 'ref_aclresources_aclroles'; public $tbRefUsersRoles = 'ref_users_aclroles'; /** * 格式化 资源的访问权限并返回 * * @return int */ static function formatAccessValue($access){ static $arr = array(self::NOBODY,self::EVERYONE,self::HAS_ROLE,self::NO_ROLE,self::ALLOCATE_ROLES); return in_array($access,$arr) ? $access : self::NOBODY; } /** * 创建资源,返回资源记录主键 * * @param string $rsid * @param int $access * @param string $desc * * @return int */ function createResource($rsid,$access,$desc){ if (empty($rsid)) return false; $resource = array( 'rsid' => $rsid, 'access' => self::formatAccessValue($access), 'desc' => $desc, 'created_at' => CURRENT_TIMESTAMP ); return SingleTableCRUD::insert($this->tbResources,$resource); } /** * 修改资源,返回成功状态 * * @param array $resource * @return int */ function updateResource(array $resource){ if (!isset($resource['rsid'])) return false; $resource['updated_at'] = CURRENT_TIMESTAMP; return SingleTableCRUD::update($this->tbResources,$resource,'rsid'); } /** * 删除资源 * * @param string $rsid * @return int */ function deleteResource($rsid){ if (empty($rsid)) return false; return SingleTableCRUD::delete($this->tbResources,array('rsid'=>$rsid)); } /** * 创建角色,返回角色记录主键 * * @param string $rolename * @param string $desc * * @return int */ function createRole($rolename,$desc){ if (empty($rolename)) return false; $role = array( 'rolename' => $rolename, 'desc' => $desc, 'created_at' => CURRENT_TIMESTAMP ); return SingleTableCRUD::insert($this->tbRoles,$role); } /** * 修改角色,返回成功状态 * * @param array $role * @return int */ function updateRole(array $role){ if (!isset($role['id'])) return false; if (isset($role['rolename'])) unset($role['rolename']); $role['updated_at'] = CURRENT_TIMESTAMP; return SingleTableCRUD::update($this->tbRoles,$role,'id'); } /** * 删除角色 * * @param int $role_id * @return int */ function deleteRole($role_id){ if (empty($role_id)) return false; return SingleTableCRUD::delete($this->tbRoles,array('role_id'=>(int) $role_id)); } /** * 为资源指定角色,每次均先全部移除表中相关记录再插入 * * @param int $rsid * @param mixed $roleIds * @param boolean $setNull 当角色id不存在时,是否将资源从关联表中清空 */ function allocateRolesForResource($rsid,$roleIds,$setNull=false,$defaultAccess=-1){ if (empty($rsid)) return false; $roleIds = normalize($roleIds,','); if (empty($roleIds)){ if ($setNull){ SingleTableCRUD::delete($this->tbRefResourcesRoles,array('rsid'=>$rsid)); if ($defaultAccess != -1){ $defaultAccess = self::formatAccessValue($defaultAccess); $this->updateResource(array('rsid'=>$rsid,'access'=>$defaultAccess)); } return true; } return false; } SingleTableCRUD::delete($this->tbRefResourcesRoles,array('rsid'=>$rsid)); $roleIds = array_unique($roleIds); foreach ($roleIds as $role_id){ SingleTableCRUD::insert($this->tbRefResourcesRoles,array('rsid'=>$rsid,'role_id'=>(int)$role_id)); } return true; } function cleanRolesForResource($rsid){ if (empty($rsid)) return false; return SingleTableCRUD::delete($this->tbRefResourcesRoles,array('rsid'=>$rsid)); } function cleanResourcesForRole($role_id){ if (empty($role_id)) return false; return SingleTableCRUD::delete($this->tbRefResourcesRoles,array('role_id'=>(int) $role_id)); } /** * 为角色分配资源,每次均先全部移除表中相关记录再插入 * * @param int $role_id * @param mixed $rsids * * @return boolean */ function allocateResourcesForRole($role_id,$rsids){ if (empty($role_id)) return false; $role_id = (int) $role_id; $rsids = normalize($rsids,','); if (empty($rsids)){ return false; } SingleTableCRUD::delete($this->tbRefResourcesRoles,array('role_id'=>$role_id)); $rsids = array_unique($rsids); foreach ($rsids as $rsid){ SingleTableCRUD::insert($this->tbRefResourcesRoles,array('rsid'=>$rsid,'role_id'=>$role_id)); } return true; } /** * 为用户指派角色,每次均先全部移除表中相关记录再插入 * * 此处在用户很多的时候可能会有性能问题 ... 后面再想怎么优化 * * @param int $user_id * @param mixed $roleIds * * @return boolean */ function allocateRolesForUser($user_id,$roleIds){ if (empty($user_id)) return false; $user_id = (int) $user_id; $roleIds = normalize($roleIds,','); if (empty($roleIds)){ return false; } SingleTableCRUD::delete($this->tbRefUsersRoles,array('user_id'=>$user_id)); $roleIds = array_unique($roleIds); foreach ($roleIds as $roleId){ SingleTableCRUD::insert($this->tbRefUsersRoles,array('user_id'=>$user_id,'role_id'=>$role_id)); } return true; } /** * 清除用户的角色信息 * * @param int $user_id * * @return boolean */ function cleanRolesForUser($user_id){ if (empty($user_id)) return false; return SingleTableCRUD::delete($this->tbRefUsersRoles,array('user_id'=>(int) $user_id)); } /** * 清除角色的用户关联 * * @param int $role_id * * @return boolean */ function cleanUsersForRole($role_id){ if (empty($role_id)) return false; return SingleTableCRUD::delete($this->tbRefUsersRoles,array('role_id'=>(int) $role_id)); } }
具体 检测的代码 如下:
/** * 对资源进行acl校验 * * @param string $rsid 资源标识 * @param array $user 特定用户,不指定则校验当前用户 * * @return boolean */ function aclVerity($rsid ,array $user = null){ if (empty($rsid)) return false; if (!CoreApp::$defaultAcl) { CoreApp::$defaultAcl = new AclFlat(); } $rsRow = aclGetResource($rsid); // 未定义资源的缺省访问策略 if (!$rsRow) return false; CoreApp::writeLog($rsRow,'test'); $rsRow['access'] = AclBase::formatAccessValue($rsRow['access']); // 允许任何人访问 if (AclBase::EVERYONE == $rsRow['access']) return true; // 不允许任何人访问 if (AclBase::NOBODY == $rsRow['access']) return false; // 获取用户信息 if (empty($user)) $user = isset($_SESSION['SI-SysUser']) ? $_SESSION['SI-SysUser'] : null; // 用户未登录,则当成无访问权限 if (empty($user)) return false; $user['roles'] = empty($user['roles']) ? null : normalize($user['roles'],';'); $userHasRoles = !empty($user['roles']); /** * 允许 不带有角色的用户访问 */ if (AclBase::NO_ROLE == $rsRow['access']) return $userHasRoles ? false : true; /** * 允许 带有角色的用户访问 */ if (AclBase::HAS_ROLE == $rsRow['access']) return $userHasRoles ? true : false; // --- 对用户进行 资源 <-> 角色 校验 if ($userHasRoles){ foreach ($user['roles'] as $role_id){ if ( aclGetRefResourcesRoles($rsid,$role_id) ) return true; } dump($user); } return false; }
评论
4 楼
Theobob
2016-05-24
3 楼
yuanhui001
2011-09-07
2 楼
vb2005xu
2011-09-07
/** * 对资源进行acl校验 * * @param string $rsid 资源标识 * @param array $user 特定用户,不指定则校验当前用户 * * @return boolean */ function aclVerity($rsid ,array $user = null){ if (empty($rsid)) return false; if (!CoreApp::$defaultAcl) { CoreApp::$defaultAcl = new AclFlat(); } $rsRow = aclGetResource($rsid); // 未定义资源的缺省访问策略 if (!$rsRow) return false; CoreApp::writeLog($rsRow,'test'); /* * 校验步骤如下: * * 1. 先校验 资源本身 access 属性 * EVERYONE => true,NOBODY => false * 其它的属性在下面继续校验 * 2. 从 session(或者 用户session表)中获取角色id集合 * 3. 如果 用户拥有角色 则 HAS_ROLE => true , NO_ROLE => false;反之亦然 * 4. 如果资源 access == ALLOCATE_ROLES * 1. 从缓存(或者 $tbRefResourcesRoles)中获取 资源对应的角色id集合 * 2. 将用户拥有的角色id集合 与 资源对应的角色id集合求交集 * 3. 存在交集 => true;否则 => false */ $rsRow['access'] = AclBase::formatAccessValue($rsRow['access']); // 允许任何人访问 if (AclBase::EVERYONE == $rsRow['access']) return true; // 不允许任何人访问 if (AclBase::NOBODY == $rsRow['access']) return false; // 获取用户信息 if (empty($user)) $user = isset($_SESSION['SI-SysUser']) ? $_SESSION['SI-SysUser'] : null; // 用户未登录,则当成无访问权限 if (empty($user)) return false; $user['roles'] = empty($user['roles']) ? null : normalize($user['roles'],';'); $userHasRoles = !empty($user['roles']); /** * 允许 不带有角色的用户访问 */ if (AclBase::NO_ROLE == $rsRow['access']) return $userHasRoles ? false : true; /** * 允许 带有角色的用户访问 */ if (AclBase::HAS_ROLE == $rsRow['access']) return $userHasRoles ? true : false; // --- 对用户进行 资源 <-> 角色 校验 if ($userHasRoles){ foreach ($user['roles'] as $role_id){ if ( aclGetRefResourcesRoles($rsid,$role_id) ) return true; } dump($user); } return false; } /** * 重新生成 角色资源访问控制表 * * @param string $actTable ACL表名称 * @param boolean $return 是否返回重新生成的列表 * * @return mixed */ function aclRebuildACT($actTable ,$return = false){ if (empty($actTable)) return false; global $globalConf; $rst = null; $cacheId = null; switch($actTable){ case CoreApp::$defaultAcl->tbResources: $cacheId = 'acl-resources'; $rst = SingleTableCRUD::findAll(CoreApp::$defaultAcl->tbResources); // 转成 哈希表结构 if ($rst){ $rst = array_to_hashmap($rst,'rsid'); } break; case CoreApp::$defaultAcl->tbRoles: $cacheId = 'acl-roles'; $rst = SingleTableCRUD::findAll(CoreApp::$defaultAcl->tbRoles); // 转成 哈希表结构 if ($rst){ $rst = array_to_hashmap($rst,'id'); } break; case CoreApp::$defaultAcl->tbRefResourcesRoles: $cacheId = 'acl-roles_has_resources'; $rst = SingleTableCRUD::findAll(CoreApp::$defaultAcl->tbRefResourcesRoles); if ($rst){ $_ = array(); foreach ($rst as $row) { $ref_id = "{$row['rsid']}<-|->{$row['role_id']}"; $_[$ref_id] = $row; } unset($rst); $rst = $_; } break; } if ($cacheId) writeCache($globalConf['runtime']['cacheDir'] ,$cacheId ,$rst ,true); if ($return) return $rst; } /** * 获取 角色资源访问控制表 数据 * * @param string $actTable ACL表名称 * * @return mixed */ function aclGetACT($actTable){ if (empty($actTable)) return false; static $rst = array(); $cacheId = null; switch($actTable){ case CoreApp::$defaultAcl->tbResources: $cacheId = 'acl-resources'; break; case CoreApp::$defaultAcl->tbRoles: $cacheId = 'acl-roles'; break; case CoreApp::$defaultAcl->tbRefResourcesRoles: $cacheId = 'acl-roles_has_resources'; break; } if (!$cacheId) return null; if (isset($rst[$cacheId])) return $rst[$cacheId]; global $globalConf; // 900 $rst[$cacheId] = getCache($globalConf['runtime']['cacheDir'],$cacheId,0); if ( !$rst[$cacheId] ){ $rst[$cacheId] = aclRebuildACT($actTable,true); } return $rst[$cacheId]; } /** * 获取 资源 记录 * * @param string $rsid * * @return array */ function aclGetResource($rsid){ static $rst = null; if (!$rst){ $rst = aclGetACT(CoreApp::$defaultAcl->tbResources); if (!$rst) $rst = array(); } return isset($rst[$rsid]) ? $rst[$rsid] : null; } /** * 获取 角色 记录 * * @param int $role_id * * @return array */ function aclGetRole($role_id){ static $rst = null; if (!$rst){ $rst = aclGetACT(CoreApp::$defaultAcl->tbRoles); if (!$rst) $rst = array(); } return isset($rst[$role_id]) ? $rst[$role_id] : null; } /** * 获取 用户角色关联 记录,此方法可以校验资源是否可被此角色调用 * * @param string $rsid * @param int $role_id * * @return array */ function aclGetRefResourcesRoles($rsid,$role_id){ static $rst = null; if (!$rst){ $rst = aclGetACT(CoreApp::$defaultAcl->tbRefResourcesRoles); if (!$rst) $rst = array(); } $ref_id = "{$rsid}<-|->{$role_id}"; CoreApp::writeLog(isset($rst[$ref_id])?$rst[$ref_id]:'nodata',$ref_id); return isset($rst[$ref_id]) ? $rst[$ref_id] : null; }
1 楼
vb2005xu
2011-08-05
http://code.google.com/p/php-excel/downloads/list 迷你好用的 EXCEL xml 输出方案
发表评论
-
ws-http 最简单轻量的PHP CURL工具库
2016-07-29 20:44 2632欢迎大家拍砖 https://github.com/to ... -
Facade 包装类 -- 解决视图里面长长的命名空间调用问题
2016-04-20 10:48 1750有时候模版里面定义 ... -
PHP单例模式面试注意事项
2015-10-20 09:57 1957最近面了不少PHP从业者,有实习生也有5/6年以上的开发者 ... -
NGINX 配置 SSL 证书 搭建 HTTPS 网站
2015-10-19 19:19 2921下面是详细的配置过程: 1、在服务器上使用 Open ... -
关于php cron任务管理的实现假想
2015-10-17 21:25 1904之前每开发一个计划任务功能均需要在线上操作crontab来新 ... -
修改一些PHP工具
2014-10-24 19:27 1804原来的代码 在非框架下是木有问题的,但是用在框架下就报错, ... -
sublime text linux上中文输入问题的终极解决方案
2014-10-13 11:07 8569我一直在使用sublime text ... -
qeephp3.0 发布了
2014-10-07 17:21 1707QeePHP 是一个快速、灵活的开发框架。应用各种成熟的架构 ... -
swiftmailer 的快捷助手 qser-mailer
2014-09-09 23:52 3595近日在对charsen的修改版上进行了再次的修改与调整,对 ... -
PHP 中简单的伪造IP刷票实现
2014-05-15 17:06 2764一般而言,我们的获取用户真实ip的代码大致是这样... / ... -
PHP5.5 htmlspecialchars 返回null的坑
2014-04-25 12:23 2616昨天在写 PDO数据库封装类的 测试代码时遇到这个问题,取 ... -
PHP 5.5 empty + 魔术变量 的坑
2014-04-16 15:53 1606今天在测试代码时遇到这么一个疑问? dump((in ... -
Aert_Log: 设计一个精简易用的日志
2014-04-13 18:28 2487日志记录对于应用的 ... -
创建一个简单的短链服务类
2013-07-01 18:20 1372整理一个简单的短链算法,整理到自己的代码库中: &l ... -
收集常用的PHP简单代码
2013-06-30 17:53 2059对于日常工作中整理出来的某些功能做个简单梳理: 1 ... -
简易PHP路由,支持正反向url解析支持
2013-06-21 22:23 8233几年前实现了一个简单的正向路由,那时候不会写反向路由解析, ... -
系统学习のCACHE 学习
2012-11-21 13:58 1910http://www.phpfans.net/article/ ... -
YY 下 sql查询封装类 不知道好不好使
2012-07-18 16:44 1337<?php class Pkg_Db_Actor { ... -
生成后台管理菜单 admin_menu 类
2012-05-05 18:27 4655<?php /** * 管理菜单 * */ ... -
抽取个sql生成器工具 -- 摘自 fuelphp1.1 版本
2012-04-25 20:17 1233<?php /** * Sql 创造者类 * ...
相关推荐
总的来说,这个简单的PHP ACL实现提供了一个基础框架,可以根据项目需求进行扩展,比如添加更复杂的权限模型、支持动态权限分配等。对于初学者来说,这是一个很好的起点,有助于理解权限控制的概念和实现方式。
这些文件很可能是用来演示如何通过HTTP GET请求参数实现简单的ACL权限控制。下面将详细解释ACL的概念以及如何在PHP中实现这一功能。 **访问控制列表(ACL)基本概念** 1. **ACL的定义**:访问控制列表是一系列规则...
例如,一个简单的ACL规则可能允许特定IP地址的流量,或者阻止特定端口的服务。 Java实现ACL时,可能涉及的关键概念有: 1. **数据结构**:为了存储和查找规则,可能使用了链表、树或哈希表等数据结构,以实现高效...
使用标准 ACL 可以实现简单的单向访问配置,但是这种方法有一定的局限性,例如无法根据端口号来过滤流量。 5. 使用扩展 ACL 实现单向访问配置 使用扩展 ACL 可以实现更加复杂的单向访问配置,例如根据端口号和协议...
在动态ACL的实现上,思科提供了相应的解决方案,使得路由器支持基于用户身份的动态访问控制。通过这样的配置,即使是在使用DHCP动态分配IP地址的环境中,网络管理员也能够有效地控制用户对互联网的访问权限。 在...
例如,在路由器中,可以使用 ACL 来实现简单的路由条目过滤,而在需要精确抓取路由条目的情况下,可以使用前缀列表。此外,在网络安全和防火墙等应用中,ACL 和前缀列表也可以结合使用,以实现更加复杂和精确的路由...
通过使用ACL,网络管理员能够根据特定的标准来过滤网络流量,从而实现精细化的网络管理。 - **作用**: - **过滤流量**: 根据源地址、目的地址、端口号等条件过滤进入或离开路由器的数据包。 - **安全控制**: 控制...
这类ACL相对简单,但控制粒度较粗,无法识别特定的传输层协议或端口。例如: - 允许特定主机(如172.17.31.222)通过:`access-list 1 permit host 172.17.31.222` - 禁止特定主机通过,允许其他所有主机:`access-...
标准ACL提供了一种简单而有效的方法来控制网络访问,通过精确指定源IP地址,可以实现对网络流量的精细过滤,从而增强网络安全性。然而,由于其只考虑源IP地址,对于需要更复杂过滤规则的情况(如基于协议类型或端口...
简单来说,ACL就是一种报文过滤器,它可以根据预设的规则过滤出特定的报文,并根据相应的策略决定是否允许这些报文通过。 **目的** 随着网络技术的发展,网络安全问题日益突出,如企业重要资源被随意访问、病毒侵袭...
3. Access Control Lists (ACL):理解和实现网络或系统中的权限管理,以控制不同用户或服务的访问权限。 4. Thrift框架:利用Thrift实现跨语言的通信,结合Lua和C++进行高效服务开发。 通过深入理解和实践这些知识...
- 为了更好地理解和使用Spring Security ACL,可以创建一个简单的示例,如保护一个博客文章,只允许特定用户编辑或删除他们的文章。 - 最佳实践包括合理设计权限层次,避免过度复杂化,以及定期审查和调整权限设置...
网络安全采用的技术很多,而通过访问控制列表(ACL)可以对数据流进行过滤,是实现基本的网络安全手段之一。 二、ACL概述 访问控制列表简称为 ACL,它使用包过滤技术,在路由器上读取第三层及第四层包头中的信息...
标准ACL(Access Control List)是一种常用的网络访问控制机制,它可以根据预定义的规则对网络中的数据进行过滤,以实现简单的访问控制。在这个实验中,我们将学习如何配置标准IP ACL来实现访问控制。 知识点1:...
通过配置ACL,可以实现对网络流量的有效控制,从而提高网络安全性和效率。 **1.1.1 ACL匹配顺序** ACL匹配顺序是理解并正确配置ACL的基础之一。在H3C的设备中,ACL可以通过两种方式进行匹配: 1. **配置顺序**:...
### ACL(访问控制列表)实验图文详细配置 #### 一、引言 访问控制列表(Access Control List,简称ACL)是网络设备上...此外,实验还展示了如何通过简单的配置实现特定的网络策略,这在实际工作中是非常实用的技能。
在本例中,我们使用了一个简单的 ACL 规则,禁止 pc2 的流量到达 pc1。该规则使用了源 IP 地址和目的 IP 地址来过滤流量。 结论 通过本节的 OSPF 和 ACL 配置实践,我们可以了解到 OSPF 的基本配置步骤和 ACL 的...