<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <id>https://casbin.org/zh/blog</id>
    <title>Apache Casbin (Incubating) Blog</title>
    <updated>2025-12-11T00:00:00.000Z</updated>
    <generator>https://github.com/jpmonette/feed</generator>
    <link rel="alternate" href="https://casbin.org/zh/blog"/>
    <subtitle>Apache Casbin (Incubating) Blog</subtitle>
    <icon>https://casbin.org/zh/img/favicon.png</icon>
    <entry>
        <title type="html"><![CDATA[Casbin in 2025: Authorization for the AI Agent Era]]></title>
        <id>https://casbin.org/zh/blog/casbin-2025-ai-agent-era</id>
        <link href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era"/>
        <updated>2025-12-11T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[2024 was the year AI agents moved from demos to production. The Model Context Protocol (MCP) has been adopted by Google, OpenAI, Microsoft, and many others, and the way applications talk to external services is changing. That shift brings a new set of authorization challenges we at Casbin have been working on.]]></summary>
        <content type="html"><![CDATA[<p>2024 was the year AI agents moved from demos to production. The Model Context Protocol (MCP) has been adopted by Google, OpenAI, Microsoft, and many others, and the way applications talk to external services is changing. That shift brings a new set of authorization challenges we at Casbin have been working on.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="the-world-has-changed">The World Has Changed<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#the-world-has-changed" class="hash-link" aria-label="直接链接到 The World Has Changed" title="直接链接到 The World Has Changed" translate="no">​</a></h2>
<p>When we started Casbin back in 2017, the typical authorization scenario was straightforward: a user makes a request, we check if they have permission, done. Today? An AI agent might be acting on behalf of a user, calling multiple MCP servers, each with their own tool permissions, and the whole thing needs to happen in milliseconds at the edge.</p>
<p>The MCP spec now classifies MCP servers as OAuth 2.0 Resource Servers (June 2025 update), with fine-grained scopes like <code>mcp:tools:weather</code> or <code>mcp:resources:customer-data:read</code>. That is the kind of granular permission model Casbin was built for; integration with MCP and OAuth still needs more work.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-were-working-on">What We're Working On<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#what-were-working-on" class="hash-link" aria-label="直接链接到 What We're Working On" title="直接链接到 What We're Working On" translate="no">​</a></h2>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="mcp-server-authorization">MCP Server Authorization<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#mcp-server-authorization" class="hash-link" aria-label="直接链接到 MCP Server Authorization" title="直接链接到 MCP Server Authorization" translate="no">​</a></h3>
<p>This is one of our main focus areas. When an AI agent calls an MCP server, the server must decide: can this agent, on behalf of this user, invoke this tool with these parameters?</p>
<p>Traditional RBAC is not enough. You need something like ABAC—e.g. “is this agent allowed to access customer data for Alice’s region during business hours?” We are exploring how Casbin’s policy model can express these constraints.</p>
<p>The catch: MCP servers must decide very quickly. We are looking at lightweight policy evaluation inside the MCP server process instead of calling a separate authorization service.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="edge-first-authorization">Edge-First Authorization<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#edge-first-authorization" class="hash-link" aria-label="直接链接到 Edge-First Authorization" title="直接链接到 Edge-First Authorization" translate="no">​</a></h3>
<p>Cloudflare Workers, Deno Deploy, Vercel Edge Functions - the edge computing space has exploded. In 2025, sub-50ms response times are table stakes, and you can't afford to add 100ms for an authorization check to some central server.</p>
<p>This is pushing us to think differently about how Casbin works. Can we compile policies to WebAssembly and run them directly in V8 isolates? Can we do smart policy caching at the edge while maintaining consistency? These are hard problems, and we don't have all the answers yet, but it's where things are heading.</p>
<p>We're particularly interested in the Cloudflare Workers ecosystem - they've built out a whole platform for MCP servers with built-in OAuth support. A native Casbin integration there could be powerful.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="rag-pipeline-authorization">RAG Pipeline Authorization<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#rag-pipeline-authorization" class="hash-link" aria-label="直接链接到 RAG Pipeline Authorization" title="直接链接到 RAG Pipeline Authorization" translate="no">​</a></h3>
<p>A recurring theme: companies building RAG systems where the LLM must access internal documents, but each user should only see documents they are allowed to see.</p>
<p>The OWASP Top 10 for LLM Applications 2025 lists “Sensitive Information Disclosure” as a major risk. The fix is not only to filter outputs but to ensure the LLM never retrieves documents the user is not authorized to access.</p>
<p>So authorization must happen at the vector store query level. We are looking at turning Casbin policies into metadata filters for vector DBs—i.e. a permission check becomes a WHERE clause pushed down to retrieval.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="multi-agent-scenarios">Multi-Agent Scenarios<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#multi-agent-scenarios" class="hash-link" aria-label="直接链接到 Multi-Agent Scenarios" title="直接链接到 Multi-Agent Scenarios" translate="no">​</a></h3>
<p>With multiple agents in a chain (e.g. coding agent → deployment agent → monitoring agent), permission delegation is tricky. Each agent may have different capabilities, and you must track the full chain.</p>
<p>OAuth’s On-Behalf-Of (OBO) flow covers part of this, but the logic for “can agent B do X on behalf of agent A on behalf of user alice” needs a clear model. Casbin’s role hierarchies and domain RBAC could extend to agent hierarchies; we are working through the semantics.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="the-traditional-roadmap-stuff">The Traditional Roadmap Stuff<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#the-traditional-roadmap-stuff" class="hash-link" aria-label="直接链接到 The Traditional Roadmap Stuff" title="直接链接到 The Traditional Roadmap Stuff" translate="no">​</a></h2>
<p>Of course, we're not abandoning the basics. Some practical things on our list:</p>
<p><strong>Language implementations catching up</strong> - SwiftCasbin and Lua-Casbin are still behind on features compared to the Go and Node.js versions. The <code>in</code> operator, WatcherEx, better caching for the <code>g</code> function - these need to be consistent everywhere.</p>
<p><strong>New framework middlewares</strong> - go-zero has been requested repeatedly. Poem for Rust is gaining traction. Play Framework for Java has been on the wishlist forever.</p>
<p><strong>Performance work</strong> - As policies get more complex for these new use cases, evaluation speed matters more. We need better benchmarking, profiling, and optimization across all implementations.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-we-dont-know-yet">What we don’t know yet<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#what-we-dont-know-yet" class="hash-link" aria-label="直接链接到 What we don’t know yet" title="直接链接到 What we don’t know yet" translate="no">​</a></h2>
<p>The AI agent authorization space is moving fast; we are learning as we go. Open questions:</p>
<ul>
<li class="">Should Casbin have first-class primitives for "agent identity" vs "user identity"?</li>
<li class="">How do you handle authorization for tools that are dynamically discovered via MCP?</li>
<li class="">What's the right caching strategy when policies might depend on real-time context?</li>
</ul>
<p>If you are building in this space and hitting authorization problems, we want to hear from you. The best features come from real use cases.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="getting-involved">Getting involved<a href="https://casbin.org/zh/blog/casbin-2025-ai-agent-era#getting-involved" class="hash-link" aria-label="直接链接到 Getting involved" title="直接链接到 Getting involved" translate="no">​</a></h2>
<p>We have been a GSoC organization for years, and these AI-related topics are a good fit for summer projects. You do not need to wait for GSoC—if this sounds interesting, reach out on Discord or open an issue on GitHub.</p>
<p>The next few years are going to be wild for authorization. The problems are harder, but also more interesting. We're excited to figure them out together.</p>]]></content>
        <author>
            <name>Yang Luo</name>
            <uri>https://github.com/hsluoyz</uri>
        </author>
        <category label="casbin" term="casbin"/>
        <category label="roadmap" term="roadmap"/>
        <category label="AI" term="AI"/>
        <category label="MCP" term="MCP"/>
        <category label="edge-computing" term="edge-computing"/>
        <category label="LLM" term="LLM"/>
    </entry>
    <entry>
        <title type="html"><![CDATA[Understanding How Casbin Matching Works in Detail]]></title>
        <id>https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail</id>
        <link href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail"/>
        <updated>2023-12-08T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[This post explains how to design and implement RBAC with the Casbin library. For SaaS platforms with resource hierarchies and roles that inherit permissions, Casbin is a performant option.]]></summary>
        <content type="html"><![CDATA[<p>This post explains how to design and implement RBAC with the <a href="https://casbin.org/" target="_blank" rel="noopener noreferrer" class="">Casbin</a> library. For SaaS platforms with resource hierarchies and roles that inherit permissions, Casbin is a performant option.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="introduction-to-rbac">Introduction to RBAC<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#introduction-to-rbac" class="hash-link" aria-label="直接链接到 Introduction to RBAC" title="直接链接到 Introduction to RBAC" translate="no">​</a></h2>
<p>RBAC restricts access based on the roles users hold. To see how <strong>hierarchical</strong> RBAC works, we look at Azure’s RBAC and then implement something similar in Casbin.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="azures-hierarchical-rbac">Azure’s hierarchical RBAC<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#azures-hierarchical-rbac" class="hash-link" aria-label="直接链接到 Azure’s hierarchical RBAC" title="直接链接到 Azure’s hierarchical RBAC" translate="no">​</a></h2>
<p><img decoding="async" loading="lazy" alt="Azure Hierarchy" src="https://casbin.org/zh/assets/images/azure-scope-levels-ab777b508163e62784aaf8f3e05f1db5.png" width="433" height="281" class="img_ev3q"></p>
<p>In Azure, the <strong>Owner</strong> role applies at different scopes. If I have <strong>Owner</strong> at the subscription level, I am Owner of all resource groups and resources under that subscription. If I have Owner at a resource group level, I am Owner of all resources in that group.</p>
<p>The image below shows Owner access at the subscription level. <img decoding="async" loading="lazy" alt="Subscription Owner" src="https://casbin.org/zh/assets/images/subscription-owner-f1a7e1c9c03d7c587ce910ae5e6d8a35.png" width="3456" height="1836" class="img_ev3q"></p>
<p>Checking IAM for a resource group under that subscription shows inherited Owner access. <img decoding="async" loading="lazy" alt="RG Owner" src="https://casbin.org/zh/assets/images/rg-owner-9c6cd2ae5997a5fba717c445f43130e6.png" width="3456" height="1836" class="img_ev3q"></p>
<p>That is how Azure’s RBAC is hierarchical. Many systems use similar hierarchies. In this tutorial we implement a comparable model with Casbin.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="how-casbin-works">How Casbin works<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#how-casbin-works" class="hash-link" aria-label="直接链接到 How Casbin works" title="直接链接到 How Casbin works" translate="no">​</a></h2>
<p>Understanding Casbin’s building blocks (request, policy, matcher, effect) makes it easier to design and tune your RBAC model.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-is-acl">What is ACL?<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#what-is-acl" class="hash-link" aria-label="直接链接到 What is ACL?" title="直接链接到 What is ACL?" translate="no">​</a></h2>
<p><strong>ACL (Access Control List)</strong> maps users to actions and actions to resources.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="model-definition">Model definition<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#model-definition" class="hash-link" aria-label="直接链接到 Model definition" title="直接链接到 Model definition" translate="no">​</a></h3>
<p>A minimal ACL model:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[request_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">r = sub, act, obj</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[policy_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">p = sub, act, obj</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[policy_effect]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e = some(where (p.eft == allow))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[matchers]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">m = r.sub == p.sub &amp;&amp; r.obj == p.obj &amp;&amp; r.act == p.act</span><br></span></code></pre></div></div>
<ol>
<li class=""><strong>request_definition</strong> — Defines the request format. E.g. <code>alice, write, data1</code> means “Can Alice write data1?”</li>
<li class=""><strong>policy_definition</strong> — Defines the policy format. E.g. a policy <code>alice, write, data1</code> grants Alice permission to write data1.</li>
<li class=""><strong>policy_effect</strong> — How multiple matching policies are combined (e.g. allow-override).</li>
<li class=""><strong>matchers</strong> — The condition that must hold: <code>r.sub == p.sub &amp;&amp; r.obj == p.obj &amp;&amp; r.act == p.act</code>.</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="try-it-in-the-casbin-editor">Try it in the Casbin editor<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#try-it-in-the-casbin-editor" class="hash-link" aria-label="直接链接到 Try it in the Casbin editor" title="直接链接到 Try it in the Casbin editor" translate="no">​</a></h3>
<p>Open the <a href="https://casbin.org/editor" target="_blank" rel="noopener noreferrer" class="">Casbin editor</a> and paste the model above into the Model editor.</p>
<p>Paste the following in the Policy editor:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> read</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> bob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data2</span><br></span></code></pre></div></div>
<p>and the following in the Request editor:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> read</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data1</span><br></span></code></pre></div></div>
<p>The result will be:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">true</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="visual-representation-of-the-acl-model-policy-and-request-matching">Visual representation of the ACL model, policy, and request matching<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#visual-representation-of-the-acl-model-policy-and-request-matching" class="hash-link" aria-label="直接链接到 Visual representation of the ACL model, policy, and request matching" title="直接链接到 Visual representation of the ACL model, policy, and request matching" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="acl" src="https://casbin.org/zh/assets/images/acl-704097c47b27a1f2235c82f593af469e.png" width="6968" height="3096" class="img_ev3q"></p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="what-is-rbac">What is RBAC?<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#what-is-rbac" class="hash-link" aria-label="直接链接到 What is RBAC?" title="直接链接到 What is RBAC?" translate="no">​</a></h2>
<p><strong>RBAC (Role-Based Access Control)</strong> assigns users to roles; roles have permissions on resources. A request checks whether the user’s role allows the action on the resource.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="model-definition-1">Model definition<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#model-definition-1" class="hash-link" aria-label="直接链接到 Model definition" title="直接链接到 Model definition" translate="no">​</a></h3>
<p>A simple RBAC model:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[request_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">r = sub, act, obj</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[policy_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">p = sub, act, obj</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[role_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">g = _, _</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">g2 = _, _</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[policy_effect]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e = some(where (p.eft == allow))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[matchers]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">m = r.sub == p.sub &amp;&amp; g(p.act, r.act) &amp;&amp; r.obj == p.obj</span><br></span></code></pre></div></div>
<ol>
<li class=""><strong>role_definition</strong> — Defines graph relations (e.g. <code>g</code> for role–role or user–role). The matcher uses these to resolve roles and permissions.</li>
</ol>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="try-it-in-the-casbin-editor-1">Try it in the Casbin editor<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#try-it-in-the-casbin-editor-1" class="hash-link" aria-label="直接链接到 Try it in the Casbin editor" title="直接链接到 Try it in the Casbin editor" translate="no">​</a></h3>
<p>Open the <a href="https://casbin.org/editor" target="_blank" rel="noopener noreferrer" class="">editor</a> and paste the model above.</p>
<p>Paste the following in the Policy editor:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> bob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> write</span><br></span></code></pre></div></div>
<p>and the following in the Request editor:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> read</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">bob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">bob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> read</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">bob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> write</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> data1</span><br></span></code></pre></div></div>
<p>The result will be:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">false</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">true</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">false</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="visual-representation-of-the-rbac-model-policy-and-request-matching">Visual representation of the RBAC model, policy, and request matching<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#visual-representation-of-the-rbac-model-policy-and-request-matching" class="hash-link" aria-label="直接链接到 Visual representation of the RBAC model, policy, and request matching" title="直接链接到 Visual representation of the RBAC model, policy, and request matching" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="rbac" src="https://casbin.org/zh/assets/images/rbac-4c8e405408b9e4df554f7cd619eae897.png" width="7016" height="2844" class="img_ev3q"></p>
<p>The <strong>g</strong> (role-to-action) relation is a graph. In policy it is written as edges, for example:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> write</span><br></span></code></pre></div></div>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_BuS1"><p><strong>p</strong> is a normal policy (compared with <code>==</code>). <strong>g</strong> is a graph relation. You can add more with suffixes: <strong>g2</strong>, <strong>g3</strong>, etc.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="hierarchical-rbac">Hierarchical RBAC<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#hierarchical-rbac" class="hash-link" aria-label="直接链接到 Hierarchical RBAC" title="直接链接到 Hierarchical RBAC" translate="no">​</a></h2>
<p>In hierarchical RBAC there are multiple <strong>resource types</strong> with inheritance (e.g. Subscription → ResourceGroup). A subscription <strong>sub1</strong> can contain resource groups <strong>rg1</strong>, <strong>rg2</strong>. Similarly, there are subscription-level roles/actions and resource-group-level roles/actions, with inheritance between them. For example, the subscription role <strong>sub-owner</strong> might inherit to the resource-group role <strong>rg-owner</strong>: if I have <strong>sub-owner</strong> on <strong>sub1</strong>, I effectively have <strong>rg-owner</strong> on <strong>rg1</strong> and <strong>rg2</strong>.</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="model-definition-2">Model definition<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#model-definition-2" class="hash-link" aria-label="直接链接到 Model definition" title="直接链接到 Model definition" translate="no">​</a></h3>
<p>A minimal hierarchical RBAC model:</p>
<div class="language-toml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-toml codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">[request_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">r = sub, act, obj</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[policy_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">p = sub, act, obj</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[role_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">g = _, _</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">g2 = _, _</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[policy_effect]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e = some(where (p.eft == allow))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[matchers]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">m = r.sub == p.sub &amp;&amp; g(p.act, r.act) &amp;&amp; g2(p.obj, r.obj)</span><br></span></code></pre></div></div>
<p>Here <strong>g</strong> links roles/actions and <strong>g2</strong> links resources (e.g. subscription to resource group).</p>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="try-it-in-the-casbin-editor-2">Try it in the Casbin editor<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#try-it-in-the-casbin-editor-2" class="hash-link" aria-label="直接链接到 Try it in the Casbin editor" title="直接链接到 Try it in the Casbin editor" translate="no">​</a></h3>
<p>Open the <a href="https://casbin.org/editor" target="_blank" rel="noopener noreferrer" class="">editor</a> and paste the model above.</p>
<p>Paste the following in the Policy editor:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> bob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg2</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">// subscription role to subscription action mapping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-write</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">// resourceGroup role to resourceGroup action mapping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-write</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">// subscription role to resourceGroup role mapping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-reader</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-owner</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">// subscription resource to resourceGroup resource mapping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg2</span><br></span></code></pre></div></div>
<p>And paste the following in the Request editor:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-read</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg1</span><br></span></code></pre></div></div>
<p>The result will be:</p>
<div class="language-text codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-text codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">true</span><br></span></code></pre></div></div>
<h3 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="visual-representation-of-the-rbac-model-policy-and-request-matching-1">Visual representation of the RBAC model, policy, and request matching<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#visual-representation-of-the-rbac-model-policy-and-request-matching-1" class="hash-link" aria-label="直接链接到 Visual representation of the RBAC model, policy, and request matching" title="直接链接到 Visual representation of the RBAC model, policy, and request matching" translate="no">​</a></h3>
<p><img decoding="async" loading="lazy" alt="hrbac" src="https://casbin.org/zh/assets/images/hrbac-1350d755e04234a34394996344d2b259.png" width="7968" height="4204" class="img_ev3q"></p>
<p>The <strong>g</strong> edges (role → action, role → role) can be written in policy as:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">// subscription role to subscription action mapping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-write</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">// resourceGroup role to resourceGroup action mapping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-read</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-write</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">// subscription role to resourceGroup role mapping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-reader</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-reader</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub-owner</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg-owner</span><br></span></code></pre></div></div>
<p>The <strong>g2</strong> edges map subscription to resource group:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">// subscription resource to resourceGroup resource mapping</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub1</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg1</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> sub2</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> rg2</span><br></span></code></pre></div></div>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="subject-matching-visual-representation">Subject Matching Visual representation<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#subject-matching-visual-representation" class="hash-link" aria-label="直接链接到 Subject Matching Visual representation" title="直接链接到 Subject Matching Visual representation" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="hrbac-sub-match" src="https://casbin.org/zh/assets/images/hrbac-sub-match-55dffd4e5fadb9773658dc90bacbb091.png" width="8176" height="4336" class="img_ev3q"></p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="action-matching-visual-representation">Action Matching Visual representation<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#action-matching-visual-representation" class="hash-link" aria-label="直接链接到 Action Matching Visual representation" title="直接链接到 Action Matching Visual representation" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="hrbac-act-match" src="https://casbin.org/zh/assets/images/hrbac-act-match-bbb086158782591771f2df01419dc4b8.png" width="7964" height="4376" class="img_ev3q"></p>
<h4 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="object-matching-visual-representation">Object Matching Visual representation<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#object-matching-visual-representation" class="hash-link" aria-label="直接链接到 Object Matching Visual representation" title="直接链接到 Object Matching Visual representation" translate="no">​</a></h4>
<p><img decoding="async" loading="lazy" alt="hrbac-obj-match" src="https://casbin.org/zh/assets/images/hrbac-obj-match-aad370d5cbfe1020ec108b9242f8d4bd.png" width="7964" height="4296" class="img_ev3q"></p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>信息</div><div class="admonitionContent_BuS1"><p>Casbin evaluates the request against all policies. If at least one policy matches, the result is <strong>true</strong>; otherwise <strong>false</strong>.</p></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="conclusion">Conclusion<a href="https://casbin.org/zh/blog/2023/12/08/understanding-casbin-matching-in-detail#conclusion" class="hash-link" aria-label="直接链接到 Conclusion" title="直接链接到 Conclusion" translate="no">​</a></h2>
<p>This tutorial showed how ACL, RBAC, and hierarchical RBAC can be expressed in Casbin. In a follow-up, we will implement this in a Spring Boot app and secure APIs with Casbin.</p>]]></content>
        <author>
            <name>Aravinda Kumar</name>
            <uri>https://github.com/aravindarc</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Authorization in APISIX Using Casbin]]></title>
        <id>https://casbin.org/zh/blog/2021/08/19/apisix-casbin-authorization</id>
        <link href="https://casbin.org/zh/blog/2021/08/19/apisix-casbin-authorization"/>
        <updated>2021-08-19T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[简介]]></summary>
        <content type="html"><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="简介">简介<a href="https://casbin.org/zh/blog/2021/08/19/apisix-casbin-authorization#%E7%AE%80%E4%BB%8B" class="hash-link" aria-label="直接链接到 简介" title="直接链接到 简介" translate="no">​</a></h2>
<p><a href="https://apisix.apache.org/" target="_blank" rel="noopener noreferrer" class="">APISIX</a> is a high-performance, scalable, cloud-native API gateway built on Nginx and etcd, and an Apache Software Foundation project. It ships with many plugins for authentication, monitoring, routing, and more. Plugins are hot-reloaded without restarts, so you can change behavior on the fly.</p>
<p>When you need <strong>authorization</strong> beyond simple checks, the <strong>authz-casbin</strong> plugin can help. It is an APISIX plugin built on <a href="https://github.com/casbin/lua-casbin/" target="_blank" rel="noopener noreferrer" class="">Lua Casbin</a> that enforces flexible authorization using models such as ACL, RBAC, and ABAC. <a class="" href="https://casbin.org/zh/">Casbin</a> is an authorization library (originally in Go, now ported to many languages); Lua Casbin is the Lua port. We proposed the plugin in the APISIX repo (<a href="https://github.com/apache/apisix/issues/4674" target="_blank" rel="noopener noreferrer" class="">#4674</a>); after review and improvements, it was merged (<a href="https://github.com/apache/apisix/pull/4710" target="_blank" rel="noopener noreferrer" class="">#4710</a>).</p>
<p>This post shows how to implement <strong>Role-Based Access Control (RBAC)</strong> in APISIX using authz-casbin.</p>
<p><strong>Note:</strong> Casbin handles <strong>authorization</strong> only. Use another plugin or your own logic for <strong>authentication</strong> (identifying the user).</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="创建模型">创建模型<a href="https://casbin.org/zh/blog/2021/08/19/apisix-casbin-authorization#%E5%88%9B%E5%BB%BA%E6%A8%A1%E5%9E%8B" class="hash-link" aria-label="直接链接到 创建模型" title="直接链接到 创建模型" translate="no">​</a></h2>
<p>The plugin authorizes each request using three parameters: <strong>subject</strong>, <strong>object</strong>, and <strong>action</strong>. The subject comes from a header (e.g. <code>username: alice</code>), the object is the URL path, and the action is the HTTP method.</p>
<p>Suppose we have three paths: <code>/</code>, <code>/res1</code>, and <code>/res2</code>. We want a model like this:</p>
<p><img decoding="async" loading="lazy" alt="图像" src="https://casbin.org/zh/assets/images/model-1c0c2441dd19f8b957744635985283eb.png" width="4520" height="1720" class="img_ev3q"></p>
<p>So: any user (e.g. <code>jack</code>) can access <code>/</code>; users with the <code>admin</code> role (e.g. <code>alice</code>, <code>bob</code>) can access everything; and non-admin users are limited to <code>GET</code>. Here is a model that does that:</p>
<div class="language-ini codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-ini codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">request_definition</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">r</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">sub, obj, act</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">policy_definition</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">p</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">sub, obj, act</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">role_definition</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">g</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">_, _</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">policy_effect</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">e</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">some(where (p.eft == allow))</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token section punctuation" style="color:#393A34">[</span><span class="token section section-name selector" style="color:#00009f">matchers</span><span class="token section punctuation" style="color:#393A34">]</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token key attr-name" style="color:#00a4db">m</span><span class="token plain"> </span><span class="token punctuation" style="color:#393A34">=</span><span class="token plain"> </span><span class="token value attr-value" style="color:#e3116c">(g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) &amp;&amp; keyMatch(r.obj, p.obj) &amp;&amp; keyMatch(r.act, p.act)</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="创建策略">创建策略<a href="https://casbin.org/zh/blog/2021/08/19/apisix-casbin-authorization#%E5%88%9B%E5%BB%BA%E7%AD%96%E7%95%A5" class="hash-link" aria-label="直接链接到 创建策略" title="直接链接到 创建策略" translate="no">​</a></h2>
<p>For the scenario above, the policy could be:</p>
<div class="language-csv codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-csv codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token value">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> *</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> /</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> GET</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">p</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> admin</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> *</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> *</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> alice</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> admin</span><span class="token plain"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain"></span><span class="token value">g</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> bob</span><span class="token punctuation" style="color:#393A34">,</span><span class="token value"> admin</span><br></span></code></pre></div></div>
<p>The matcher means:</p>
<ol>
<li class=""><strong><code>(g(r.sub, p.sub) || keyMatch(r.sub, p.sub))</code></strong> — The request subject either has the policy subject as a role or matches it via <code>keyMatch</code>. For <code>keyMatch</code> and other built-ins, see <a href="https://github.com/casbin/lua-casbin/blob/master/src/util/BuiltInFunctions.lua" target="_blank" rel="noopener noreferrer" class="">Lua Casbin BuiltInFunctions</a>.</li>
<li class=""><strong><code>keyMatch(r.obj, p.obj)</code></strong> — The request path matches the policy object.</li>
<li class=""><strong><code>keyMatch(r.act, p.act)</code></strong> — The request method matches the policy action.</li>
</ol>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="enabling-the-plugin-on-a-route">Enabling the plugin on a route<a href="https://casbin.org/zh/blog/2021/08/19/apisix-casbin-authorization#enabling-the-plugin-on-a-route" class="hash-link" aria-label="直接链接到 Enabling the plugin on a route" title="直接链接到 Enabling the plugin on a route" translate="no">​</a></h2>
<p>After creating the model and policy, enable the plugin on a route via the APISIX Admin API. Using <strong>file paths</strong>:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "authz-casbin": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "model_path": "/path/to/model.conf",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "policy_path": "/path/to/policy.csv",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "username": "username"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "upstream": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "nodes": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "127.0.0.1:1980": 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "type": "roundrobin"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "uri": "/*"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}'</span><br></span></code></pre></div></div>
<p>The <code>username</code> field is the <strong>header name</strong> that carries the subject (e.g. if the header is <code>user: alice</code>, set <code>"username": "user"</code>).</p>
<p>To use <strong>inline</strong> model and policy text instead of files, use the <code>model</code> and <code>policy</code> fields:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "authz-casbin": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "model": "[request_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            r = sub, obj, act</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            [policy_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            p = sub, obj, act</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            [role_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            g = _, _</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            [policy_effect]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            e = some(where (p.eft == allow))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            [matchers]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) &amp;&amp; keyMatch(r.obj, p.obj) &amp;&amp; keyMatch(r.act, p.act)",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "policy": "p, *, /, GET</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            p, admin, *, *</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            g, alice, admin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            g, bob, admin",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "username": "username"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "upstream": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "nodes": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "127.0.0.1:1980": 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "type": "roundrobin"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "uri": "/*"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}'</span><br></span></code></pre></div></div>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="using-a-global-model-and-policy">Using a global model and policy<a href="https://casbin.org/zh/blog/2021/08/19/apisix-casbin-authorization#using-a-global-model-and-policy" class="hash-link" aria-label="直接链接到 Using a global model and policy" title="直接链接到 Using a global model and policy" translate="no">​</a></h2>
<p>To use one model and policy for <strong>all</strong> routes, store them in the plugin’s metadata. Send a <code>PUT</code> request:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl http://127.0.0.1:9080/apisix/admin/plugin_metadata/authz-casbin -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -i -X PUT -d '</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"model": "[request_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">r = sub, obj, act</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[policy_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">p = sub, obj, act</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[role_definition]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">g = _, _</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[policy_effect]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">e = some(where (p.eft == allow))</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">[matchers]</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">m = (g(r.sub, p.sub) || keyMatch(r.sub, p.sub)) &amp;&amp; keyMatch(r.obj, p.obj) &amp;&amp; keyMatch(r.act, p.act)",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain" style="display:inline-block"></span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">"policy": "p, *, /, GET</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">p, admin, *, *</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">g, alice, admin</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">g, bob, admin"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}'</span><br></span></code></pre></div></div>
<p>Then enable the plugin on a route (it will use the metadata). Example:</p>
<div class="language-sh codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#393A34;--prism-background-color:#f6f8fa"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-sh codeBlock_bY9V thin-scrollbar" style="color:#393A34;background-color:#f6f8fa"><code class="codeBlockLines_e6Vv"><span class="token-line" style="color:#393A34"><span class="token plain">curl http://127.0.0.1:9080/apisix/admin/routes/1 -H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">{</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "plugins": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "authz-casbin": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "username": "username"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        }</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "upstream": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "nodes": {</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "127.0.0.1:1980": 1</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">        "type": "roundrobin"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    },</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">    "uri": "/route1/*"</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">}'</span><br></span></code></pre></div></div>
<p>The route then uses the shared model and policy from metadata. To change them, send another <code>PUT</code> to the plugin metadata; all routes using it will pick up the update.</p>
<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="use-cases">Use cases<a href="https://casbin.org/zh/blog/2021/08/19/apisix-casbin-authorization#use-cases" class="hash-link" aria-label="直接链接到 Use cases" title="直接链接到 Use cases" translate="no">​</a></h2>
<ul>
<li class=""><strong>Per-route authorization</strong> — Attach the plugin to any route with your model and policy. Good when different routes need different permissions or when policies are large (each route only loads what it needs).</li>
<li class=""><strong>Global model/policy</strong> — Store one model and policy in plugin metadata and reference it from many routes. Updating policy in one place (e.g. etcd) updates all those routes.</li>
</ul>]]></content>
        <author>
            <name>Rushikesh Tote</name>
            <uri>https://github.com/rushitote</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Yang Luo — Google Open Source Peer Bonus Winner]]></title>
        <id>https://casbin.org/zh/blog/2020/04/21/google-award</id>
        <link href="https://casbin.org/zh/blog/2020/04/21/google-award"/>
        <updated>2020-04-21T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We are pleased to announce that Casbin’s founder, Yang Luo, was named a Google Open Source Peer Bonus winner for his work on Casbin, Npcap, and Nmap in 2019 Q3.]]></summary>
        <content type="html"><![CDATA[<p>We are pleased to announce that Casbin’s founder, <a href="https://github.com/hsluoyz" target="_blank" rel="noopener noreferrer" class="">Yang Luo</a>, was named a <a href="https://opensource.google.com/docs/growing/peer-bonus/" target="_blank" rel="noopener noreferrer" class="">Google Open Source Peer Bonus</a> winner for his work on <a class="" href="https://casbin.org/zh/">Casbin</a>, <a href="https://nmap.org/npcap/" target="_blank" rel="noopener noreferrer" class="">Npcap</a>, and <a href="https://nmap.org/" target="_blank" rel="noopener noreferrer" class="">Nmap</a> in 2019 Q3.</p>
<p><img decoding="async" loading="lazy" alt="ospb" src="https://casbin.org/zh/assets/images/google-open-source-peer-bonus-award-letter-abc46f3d40f6c81ca67d20a2dadf420a.png" width="2000" height="2250" class="img_ev3q"></p>
<blockquote>
<p>The full award letter is available <a href="https://github.com/hsluoyz/hsluoyz.github.io/blob/master/download/Open%20Source%20Peer%20Bonus%20Q3%202019%20-%20Yang%20Luo%20-%20OSPB%20Award%20Letter.pdf" target="_blank" rel="noopener noreferrer" class="">here</a>.</p>
</blockquote>
<p>Google describes the program as:</p>
<blockquote>
<p><em>Just as a Google Peer Bonus recognizes a fellow Googler who has gone above and beyond, an Open Source Peer Bonus recognizes external contributors who have made exceptional contributions to open source.</em></p>
</blockquote>
<p>The <a href="https://opensource.googleblog.com/2020/01/announcing-2019-second-cycle-google.html" target="_blank" rel="noopener noreferrer" class="">2019 winners announcement</a> lists Yang and Casbin alongside other impactful projects and developers, including Git, TensorFlow, V8, CPython, LLVM, Apache projects, Angular, and Jenkins.</p>
<p>We are proud to see Casbin recognized for its work in open source and cloud security.</p>
<p><em>感谢你！Casbin！</em></p>]]></content>
        <author>
            <name>Casbin</name>
            <uri>https://github.com/casbin</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Reworking Our Documentation]]></title>
        <id>https://casbin.org/zh/blog/2018/09/23/new-website</id>
        <link href="https://casbin.org/zh/blog/2018/09/23/new-website"/>
        <updated>2018-09-23T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We have moved Casbin’s documentation from GitHub Wiki to the Docs section of this site, powered by Docusaurus. You get better Markdown rendering, full-text search, versioning, and translation.]]></summary>
        <content type="html"><![CDATA[<p>We have moved Casbin’s documentation from GitHub Wiki to the <strong>Docs</strong> section of this site, powered by Docusaurus. You get better Markdown rendering, full-text search, versioning, and translation.</p>
<p>The docs are still being improved. The site source is on GitHub: <a href="https://github.com/casbin/casbin-website-v2" target="_blank" rel="noopener noreferrer" class="">https://github.com/casbin/casbin-website-v2</a></p>
<p>Contributions and suggestions are welcome.</p>]]></content>
        <author>
            <name>Yang Luo</name>
            <uri>https://github.com/hsluoyz</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[node-Casbin: New Member of the Casbin Family]]></title>
        <id>https://casbin.org/zh/blog/2018/08/27/node-casbin</id>
        <link href="https://casbin.org/zh/blog/2018/08/27/node-casbin"/>
        <updated>2018-08-27T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[We have ported Casbin to Node.js: node-Casbin.]]></summary>
        <content type="html"><![CDATA[<p>We have ported Casbin to Node.js: <a href="https://github.com/casbin/node-casbin" target="_blank" rel="noopener noreferrer" class="">node-Casbin</a>.</p>
<p><strong>node-Casbin</strong> keeps the same usage and API as other Casbin implementations. Middlewares for Express, Koa2, and Egg.js are available, and a Sequelize storage adapter is included.</p>
<p>We hope it fits your stack. Feedback and contributions are welcome.</p>
<p>GitHub: <a href="https://github.com/casbin/node-casbin" target="_blank" rel="noopener noreferrer" class="">https://github.com/casbin/node-casbin</a></p>]]></content>
        <author>
            <name>Zixuan Liu</name>
            <uri>https://github.com/nodece</uri>
        </author>
    </entry>
    <entry>
        <title type="html"><![CDATA[Casbin 服务器已启动！]]></title>
        <id>https://casbin.org/zh/blog/2018/08/07/launching-casbin-server</id>
        <link href="https://casbin.org/zh/blog/2018/08/07/launching-casbin-server"/>
        <updated>2018-08-07T00:00:00.000Z</updated>
        <summary type="html"><![CDATA[People often ask whether Casbin can run as a service instead of a library. The answer is yes. We have launched Casbin Server as a concrete Access Control as a Service solution.]]></summary>
        <content type="html"><![CDATA[<p>People often ask whether Casbin can run as a service instead of a library. The answer is <strong>yes</strong>. We have launched <a href="https://github.com/casbin/casbin-server" target="_blank" rel="noopener noreferrer" class="">Casbin Server</a> as a concrete <strong>Access Control as a Service</strong> solution.</p>
<p><strong>Casbin Server</strong> is under active development by the core team. Current features:</p>
<ul>
<li class="">Written in Go.</li>
<li class="">Manages many Casbin instances so you can centralize policy enforcement from multiple services.</li>
<li class=""><strong>gRPC</strong> for all client communication; <strong>REST</strong> support is planned.</li>
<li class="">A web admin UI for managing instances, models, policy storage, and load balancing.</li>
</ul>
<p>Source code: <a href="https://github.com/casbin/casbin-server" target="_blank" rel="noopener noreferrer" class="">https://github.com/casbin/casbin-server</a></p>
<p>Issues and pull requests are welcome.</p>]]></content>
        <author>
            <name>Helong Zhang</name>
            <uri>https://github.com/BetaCat0</uri>
        </author>
    </entry>
</feed>