您现在的位置是:首页 > 文章详情

CoSec 2.2.0 发布,基于 RBAC 和策略的多租户响应式安全框架

日期:2023-07-26点击:78

基于 RBAC 和策略的多租户响应式安全框架

License GitHub release Maven Central Codacy Badge codecov Integration Test Status

更新内容(v2.2.0) 🎉 🎉 🎉

全面支持 Spring Boot 3

  • 依赖:更新 me.ahoo.cosid:cosid-bom 版本 v2.2.5
  • 依赖:更新 org.springframework.boot:spring-boot-dependencies 版本 v3.1.2
  • 依赖:更新 me.ahoo.cocache:cocache-bom 版本 v2.0.3
  • 特性:新增 MatcherFactoryRegister 支持扫描注册 Spring 容器定义的 ConditionMatcherFactory / ActionMatcherFactory 增强 SPI
  • 特性:EqConditionMatcher 支持参数 ignoreCase
  • 特性:支持从路径变量(:/user/{id})中抽取参数,注入到安全上下文(request.path.var.*),以供 ConditionMatcher 使用
  • 特性:EqConditionMatcher 支持 Spel 表达式语言
 { "name": "RequestPathVarTemplate", "action": "/user/{id}", "condition": { "eq": { "part": "request.path.var.id", "value": "#{principal.id}" } } }

认证

Authentication-Flow

授权

Authorization-Flow

OAuth

OAuth-Flow

建模类图

Modeling

安全网关服务

Gateway

授权策略流程

Authorization Policy

内置策略匹配器

ActionMatcher

ActionMatcher

如何自定义 ActionMatcher (SPI)

参考 PathActionMatcher

 class CustomActionMatcherFactory : ActionMatcherFactory { companion object { const val TYPE = "[CustomActionType]" } override val type: String get() = TYPE override fun create(configuration: Configuration): ConditionMatcher { return CustomActionMatcher(configuration) } } class CustomActionMatcher(override val configuration: Configuration) : ActionMatcher { override val type: String get() = CustomActionMatcherFactory.TYPE override fun match(request: Request, securityContext: SecurityContext): Boolean { //Custom matching logic } }

META-INF/services/me.ahoo.cosec.policy.action.ActionMatcherFactory

 # CustomActionMatcherFactory fully qualified name 

ConditionMatcher

ConditionMatcher

如何自定义 ConditionMatcher (SPI)

参考 ContainsConditionMatcher

 class CustomConditionMatcherFactory : ConditionMatcherFactory {     companion object {         const val TYPE = "[CustomConditionType]"     }     override val type: String         get() = TYPE     override fun create(configuration: Configuration): ConditionMatcher {         return CustomConditionMatcher(configuration)     } } class CustomConditionMatcher(configuration: Configuration) :     AbstractConditionMatcher(CustomConditionMatcherFactory.TYPE, configuration) {     override fun internalMatch(request: Request, securityContext: SecurityContext): Boolean {         //Custom matching logic     } }

META-INF/services/me.ahoo.cosec.policy.condition.ConditionMatcherFactory

 # CustomConditionMatcherFactory fully qualified name 

策略 Schema

配置 Policy Schema 以支持 IDE (IntelliJ IDEA) 输入自动完成。

策略 Demo

 { "id": "id", "name": "name", "category": "category", "description": "description", "type": "global", "tenantId": "tenantId", "condition": { "bool": { "and": [ { "authenticated": {} }, { "rateLimiter": { "permitsPerSecond": 10 } } ] } }, "statements": [ { "action": { "path": { "pattern": "/user/#{principal.id}/*", "options": { "caseSensitive": false, "separator": "/", "decodeAndParseSegments": false } } } }, { "name": "Anonymous", "action": [ "/auth/register", "/auth/login" ] }, { "name": "UserScope", "action": "/user/#{principal.id}/*", "condition": { "authenticated": {} } }, { "name": "Developer", "action": "*", "condition": { "in": { "part": "context.principal.id", "value": [ "developerId" ] } } }, { "name": "RequestOriginDeny", "effect": "deny", "action": "*", "condition": { "regular": { "negate": true, "part": "request.origin", "pattern": "^(http|https)://github.com" } } }, { "name": "IpBlacklist", "effect": "deny", "action": "*", "condition": { "path": { "part": "request.remoteIp", "pattern": "192.168.0.*", "options": { "caseSensitive": false, "separator": ".", "decodeAndParseSegments": false } } } }, { "name": "RegionWhitelist", "effect": "deny", "action": "*", "condition": { "regular": { "negate": true, "part": "request.attributes.ipRegion", "pattern": "^中国\\|0\\|(上海|广东省)\\|.*" } } }, { "name": "AllowDeveloperOrIpRange", "action": "*", "condition": { "bool": { "and": [ { "authenticated": {} } ], "or": [ { "in": { "part": "context.principal.id", "value": [ "developerId" ] } }, { "path": { "part": "request.remoteIp", "pattern": "192.168.0.*", "options": { "caseSensitive": false, "separator": ".", "decodeAndParseSegments": false } } } ] } } }, { "name": "TestContains", "effect": "allow", "action": "*", "condition": { "contains": { "part": "request.attributes.ipRegion", "value": "上海" } } }, { "name": "TestStartsWith", "effect": "allow", "action": "*", "condition": { "startsWith": { "part": "request.attributes.ipRegion", "value": "中国" } } }, { "name": "TestEndsWith", "effect": "allow", "action": "*", "condition": { "endsWith": { "part": "request.attributes.remoteIp", "value": ".168.0.1" } } } ] }

应用权限元数据 Schema

配置 App Permission Schema 以支持 IDE (IntelliJ IDEA) 输入自动完成。

应用权限元数据 Demo

 { "id": "manage", "condition": { "bool": { "and": [ { "authenticated": {} }, { "groupedRateLimiter": { "part": "request.remoteIp", "permitsPerSecond": 10, "expireAfterAccessSecond": 1000 } }, { "inTenant": { "value": "default" } } ] } }, "groups": [ { "name": "order", "description": "order management", "permissions": [ { "id": "manage.order.ship", "name": "Ship", "description": "Ship", "action": "/order/ship" }, { "id": "manage.order.issueInvoice", "name": "Issue an invoice", "description": "Issue an invoice", "action": "/order/issueInvoice" } ] } ] }

OpenTelemetry

CoSec-OpenTelemetry

CoSec 遵循 OpenTelemetry General identity attributes 规范。

CoSec-OpenTelemetry

感谢

CoSec 权限策略设计参考 AWS IAM 

原文链接:https://www.oschina.net/news/250970/cosec-2-2-0-released
关注公众号

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。

持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。

转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。

文章评论

共有0条评论来说两句吧...

文章二维码

扫描即可查看该文章

点击排行

推荐阅读

最新文章