<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>Apache Casbin (Incubating) Blog</title>
        <link>https://casbin.org/ru/blog</link>
        <description>Apache Casbin (Incubating) Blog</description>
        <lastBuildDate>Thu, 11 Dec 2025 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>ru</language>
        <item>
            <title><![CDATA[Casbin in 2025: Authorization for the AI Agent Era]]></title>
            <link>https://casbin.org/ru/blog/casbin-2025-ai-agent-era</link>
            <guid>https://casbin.org/ru/blog/casbin-2025-ai-agent-era</guid>
            <pubDate>Thu, 11 Dec 2025 00:00:00 GMT</pubDate>
            <description><![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.]]></description>
            <content:encoded><![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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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:encoded>
            <category>casbin</category>
            <category>roadmap</category>
            <category>AI</category>
            <category>MCP</category>
            <category>edge-computing</category>
            <category>LLM</category>
        </item>
        <item>
            <title><![CDATA[Understanding How Casbin Matching Works in Detail]]></title>
            <link>https://casbin.org/ru/blog/2023/12/08/understanding-casbin-matching-in-detail</link>
            <guid>https://casbin.org/ru/blog/2023/12/08/understanding-casbin-matching-in-detail</guid>
            <pubDate>Fri, 08 Dec 2023 00:00:00 GMT</pubDate>
            <description><![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.]]></description>
            <content:encoded><![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/ru/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/ru/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" src="https://learn.microsoft.com/en-us/azure/cloud-adoption-framework/ready/azure-setup-guide/media/organize-resources/scope-levels.png" alt="Azure Hierarchy" 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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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/ru/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:encoded>
        </item>
        <item>
            <title><![CDATA[Authorization in APISIX Using Casbin]]></title>
            <link>https://casbin.org/ru/blog/2021/08/19/apisix-casbin-authorization</link>
            <guid>https://casbin.org/ru/blog/2021/08/19/apisix-casbin-authorization</guid>
            <pubDate>Thu, 19 Aug 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[Введение]]></description>
            <content:encoded><![CDATA[<h2 class="anchor anchorTargetHideOnScrollNavbar_vjPI" id="введение">Введение<a href="https://casbin.org/ru/blog/2021/08/19/apisix-casbin-authorization#%D0%B2%D0%B2%D0%B5%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5" 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/ru/">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/ru/blog/2021/08/19/apisix-casbin-authorization#%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BC%D0%BE%D0%B4%D0%B5%D0%BB%D0%B8" 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/ru/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, действовать</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">где-то (стр. ft == 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">м</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. ub)) &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/ru/blog/2021/08/19/apisix-casbin-authorization#%D1%81%D0%BE%D0%B7%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5-%D0%BF%D0%BE%D0%BB%D0%B8%D1%82%D0%B8%D0%BA%D0%B8" 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/ru/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. :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. onf",</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            "policy_path": "/path/to/policy. sv",</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.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. :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, действовать</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 = где-то (стр. f== допустить))</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">            м = (g(r. ub, p. ub) || keyMatch(r.sub, p.sub)) &amp;&amp; keyMatch(r.obj, p.obj) &amp;&amp; keyMatch(r.act, p. ct)",</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, угла, администратора</span><br></span><span class="token-line" style="color:#393A34"><span class="token plain">            g, bob, администратор",</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><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.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/ru/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. :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 = где-то (стр. ft == 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">м = (g(r.sub, p.sub) || keyMatch(r. ub, p.sub)) &amp;&amp; keyMatch(r.obj, p.obj) &amp;&amp; keyMatch(r. ct, 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. :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.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/ru/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:encoded>
        </item>
        <item>
            <title><![CDATA[Yang Luo — Google Open Source Peer Bonus Winner]]></title>
            <link>https://casbin.org/ru/blog/2020/04/21/google-award</link>
            <guid>https://casbin.org/ru/blog/2020/04/21/google-award</guid>
            <pubDate>Tue, 21 Apr 2020 00:00:00 GMT</pubDate>
            <description><![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.]]></description>
            <content:encoded><![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/ru/">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" src="https://hsluoyz.github.io/download/Open%20Source%20Peer%20Bonus%20Q3%202019%20-%20Yang%20Luo%20-%20OSPB%20Award%20Letter.png" alt="ospb" 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>Спасибо за полёт!</em></p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Reworking Our Documentation]]></title>
            <link>https://casbin.org/ru/blog/2018/09/23/new-website</link>
            <guid>https://casbin.org/ru/blog/2018/09/23/new-website</guid>
            <pubDate>Sun, 23 Sep 2018 00:00:00 GMT</pubDate>
            <description><![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.]]></description>
            <content:encoded><![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:encoded>
        </item>
        <item>
            <title><![CDATA[node-Casbin: New Member of the Casbin Family]]></title>
            <link>https://casbin.org/ru/blog/2018/08/27/node-casbin</link>
            <guid>https://casbin.org/ru/blog/2018/08/27/node-casbin</guid>
            <pubDate>Mon, 27 Aug 2018 00:00:00 GMT</pubDate>
            <description><![CDATA[We have ported Casbin to Node.js: node-Casbin.]]></description>
            <content:encoded><![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:encoded>
        </item>
        <item>
            <title><![CDATA[Сервер Casbin запущен!]]></title>
            <link>https://casbin.org/ru/blog/2018/08/07/launching-casbin-server</link>
            <guid>https://casbin.org/ru/blog/2018/08/07/launching-casbin-server</guid>
            <pubDate>Tue, 07 Aug 2018 00:00:00 GMT</pubDate>
            <description><![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.]]></description>
            <content:encoded><![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:encoded>
        </item>
    </channel>
</rss>