{"id":225,"date":"2025-03-20T16:41:09","date_gmt":"2025-03-20T19:41:09","guid":{"rendered":"https:\/\/alice.com.br\/tech\/?p=225"},"modified":"2025-08-01T08:50:44","modified_gmt":"2025-08-01T11:50:44","slug":"autorizacao-com-opa-open-policy-agent","status":"publish","type":"post","link":"https:\/\/alice.com.br\/tech\/autorizacao-com-opa-open-policy-agent\/","title":{"rendered":"Autoriza\u00e7\u00e3o com OPA: Open Policy Agent"},"content":{"rendered":"<p>A Alice \u00e9 uma empresa de tecnologia com o prop\u00f3sito de tornar o mundo mais saud\u00e1vel. Mas, como toda empresa de tecnologia, precisa lidar com desafios comuns e decidir como vai endere\u00e7\u00e1-los. Este artigo explica um pouco dos problemas relativos a Autoriza\u00e7\u00e3o que enfrentamos, passa pelas alternativas que consideramos e mostra como a solu\u00e7\u00e3o que escolhemos resolve esses problemas (e inevitavelmente acaba criando outros).<\/p>\n<h2>O que \u00e9 Autoriza\u00e7\u00e3o? Qual a diferen\u00e7a de Autentica\u00e7\u00e3o?<\/h2>\n<p>Antes de entrar nos detalhes do tema, \u00e9 importante relembrar a diferen\u00e7a entre Autentica\u00e7\u00e3o e Autoriza\u00e7\u00e3o, dois conceitos que muitas vezes andam juntos mas s\u00e3o fundamentalmente diferentes.<\/p>\n\n<p>Em resumo, <strong>Autentica\u00e7\u00e3o<\/strong> \u00e9 o processo de Identifica\u00e7\u00e3o de um usu\u00e1rio, que garante que ele \u00e9 quem diz ser. J\u00e1 <strong>Autoriza\u00e7\u00e3o<\/strong> \u00e9 o processo que indica se um usu\u00e1rio identificado (ou n\u00e3o) tem a permiss\u00e3o para realizar determinadas a\u00e7\u00f5es dentro do sistema.<\/p>\n\n<p>Solu\u00e7\u00f5es e Frameworks que temos dispon\u00edveis para usar podem lidar com um ou ambos aspectos, e \u00e9 importante saber disso porque pode inviabilizar uma escolha. Voc\u00ea pode, por exemplo, ser obrigado a usar o aspecto de Autentica\u00e7\u00e3o da solu\u00e7\u00e3o para que o aspecto de Autoriza\u00e7\u00e3o funcione e, dependendo do caso (como foi na Alice), isso pode n\u00e3o ser desejado.<\/p>\n\n<h2>Tipos comuns de Autoriza\u00e7\u00e3o<\/h2>\n<p>Temos alguns tipos diferentes de Autoriza\u00e7\u00e3o, que cobrem a maior parte das necessidades comuns dos sistemas de mercado. Aqui descrevo os principais:<\/p>\n\n<ul>\n<li><strong>Role-Based Access Control (RBAC)<\/strong>: o tipo mais comum de controle de acesso, consiste em atribuir pap\u00e9is (roles) aos usu\u00e1rios e definir o que cada papel pode fazer. A ideia \u00e9 que pap\u00e9is possam ser atribu\u00eddos ou revogados a qualquer momento, e o sistema possa mudar seu comportamento imediatamente ap\u00f3s os pap\u00e9is mudarem. Os pap\u00e9is costumam ser uma informa\u00e7\u00e3o curta, que pode ser facilmente trafegada dentro de Tokens JWT por conveni\u00eancia.\n<ul>\n<li>Exemplo: Jo\u00e3ozinho assume o papel de analista de Opera\u00e7\u00f5es e ganha a capacidade de editar quaisquer Membros (como chamamos os pacientes da Alice) no sistema.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n<ul>\n<li><strong>Attribute-Based Access Control (ABAC)<\/strong>: controle de acesso baseado em atributos do usu\u00e1rio e \/ ou do recurso sendo acessado.\n<ul>\n<li>Exemplo: Jo\u00e3ozinho pode editar um Membro do sistema se seu atributo do usu\u00e1rio isAdmin = true, ou se o membro tem o atributo isPublic = true.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n<ul>\n<li><strong>Relationship-Based Access Control (ReBAC)<\/strong>: caso espec\u00edfico de ABAC onde uma permiss\u00e3o \u00e9 concedida se h\u00e1 um relacionamento espec\u00edfico entre o usu\u00e1rio e o recurso sendo acessado.\n<ul>\n<li>Exemplo: Jo\u00e3ozinho pode editar os dados de um Membro se o registro representar ele mesmo ou um dependente dele.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n<p>Seu sistema pode ter necessidades de Autoriza\u00e7\u00e3o em qualquer um dos n\u00edveis. No caso, as regras que a Alice precisa suportar s\u00e3o RBAC em sua maioria, com alguns casos de ABAC e ReBAC. Isso significa que a solu\u00e7\u00e3o escolhida precisa tamb\u00e9m suportar esses modelos de autoriza\u00e7\u00e3o; somente RBAC n\u00e3o \u00e9 suficiente (ou envolveria muito improviso para fazer).<\/p>\n\n<h2>Nossa abordagem original de Autoriza\u00e7\u00e3o<\/h2>\n<p>Sendo uma empresa de sa\u00fade, a Alice evidentemente tem muito contato com informa\u00e7\u00f5es pessoais e de sa\u00fade. Portanto, um mecanismo de Autoriza\u00e7\u00e3o \u00e9 essencial para garantir que dados n\u00e3o sejam acessados ou modificados por pessoas n\u00e3o autorizadas, sejam m\u00e9dicos, enfermeiros ou at\u00e9 o time de atendimento operacional.<\/p>\n<p>Inicialmente optamos por manter a camada de Autoriza\u00e7\u00e3o junto \u00e0 nossa camada compartilhada de acesso a dados (Data-Layer), que j\u00e1 realiza outras atribui\u00e7\u00f5es, como tokeniza\u00e7\u00e3o dos registros, de-identifica\u00e7\u00e3o e afins. Atrav\u00e9s de uma DSL fluida, avaliamos quatro par\u00e2metros essenciais para tomar uma decis\u00e3o de Autoriza\u00e7\u00e3o:<\/p>\n<ul>\n<li><strong>Root Service<\/strong>: o servi\u00e7o do qual se originou a solicita\u00e7\u00e3o. Isso \u00e9 importante pois um mesmo usu\u00e1rio pode ter permiss\u00f5es distintas em sistemas diferentes.<\/li>\n<li><strong>Subject<\/strong>: o usu\u00e1rio atual.<\/li>\n<li><strong>Resource<\/strong>: o recurso que se deseja acessar.<\/li>\n<li><strong>Action<\/strong>: a a\u00e7\u00e3o que o usu\u00e1rio deseja realizar no recurso. No contexto de acesso a dados, consideramos as a\u00e7\u00f5es CRUD (Create, Read, Update, Delete).<\/li>\n<\/ul>\n\n<p>Tamb\u00e9m partimos do princ\u00edpio de \u201c<strong>Least Privilege<\/strong>\u201d, o que significa que qualquer acesso precisa necessariamente ser liberado via a escrita de Policies, ou regras de autoriza\u00e7\u00e3o, na DSL supracitada. Caso contr\u00e1rio, o acesso por padr\u00e3o \u00e9 negado. Essas regras s\u00e3o deployadas junto ao Data-Layer, e toda altera\u00e7\u00e3o das mesmas exige uma nova vers\u00e3o em produ\u00e7\u00e3o para ser efetiva e impactar os usu\u00e1rios finais.<\/p>\n\n<h2>Problemas<\/h2>\n<p>A abordagem que inicialmente escolhemos nos permite grande liberdade na tomada de decis\u00f5es de Autoriza\u00e7\u00e3o, mas vem com os seguintes contrapontos:<\/p>\n<ul>\n<li><strong>Acoplamento com o Data-Layer<\/strong>: n\u00e3o podemos alterar policies sem redeployar o servi\u00e7o; regras de certos dom\u00ednios acessam diretamente dados de outros dom\u00ednios sem passar pelo servi\u00e7o correspondente, quebrando o encapsulamento. Gera acoplamento da pr\u00f3pria camada de dados com os modelos servidos por ela.<\/li>\n<li><strong>Testes<\/strong>: n\u00e3o \u00e9 trivial escrever testes das policies e \u00e9 comum haver erros em tempo de desenvolvimento descobrindo que esquecemos de incluir uma policy necess\u00e1ria.<\/li>\n<li><strong>Isolamento (\u201csiloing\u201d)<\/strong>: a altera\u00e7\u00e3o de policies \u00e9 altamente t\u00e9cnica e s\u00f3 pode ser feita por desenvolvedores back-end. N\u00e3o h\u00e1 UI ou facilitador para isso.<\/li>\n<li><strong>Escopo<\/strong>: limitado somente \u00e0 camada de acesso a dados; isso significa que, com esse mecanismo, n\u00e3o temos capacidade de tomar decis\u00f5es de exibi\u00e7\u00e3o de itens visuais no front-end de acordo com o perfil do usu\u00e1rio, por exemplo.<\/li>\n<\/ul>\n\n<p>Com esses aspectos em mente, olhamos para o mercado procurando por uma solu\u00e7\u00e3o de Autoriza\u00e7\u00e3o que suportasse as nossas necessidades, ao mesmo tempo que mitigasse a maior parte poss\u00edvel desses problemas.<\/p>\n\n<h2>Alternativas consideradas<\/h2>\n<p>Um ponto importante na hora de elencar a solu\u00e7\u00e3o: n\u00e3o t\u00ednhamos a inten\u00e7\u00e3o de mudar o mecanismo de Autentica\u00e7\u00e3o utilizado atualmente, o que significa que solu\u00e7\u00f5es que fazem a \u201cvenda casada\u201d com Autoriza\u00e7\u00e3o (por exemplo, <a href=\"https:\/\/www.keycloak.org\/\">keycloak<\/a> e <a href=\"https:\/\/www.aserto.com\/\">aserto<\/a>) n\u00e3o resolveriam nosso problema.<\/p>\n\n<p>Assim sendo, encontramos duas alternativas mais em linha com o que busc\u00e1vamos:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.osohq.com\/docs\">Oso Cloud<\/a><\/li>\n<li><a href=\"https:\/\/www.openpolicyagent.org\/\">Open Policy Agent<\/a> (OPA)<\/li>\n<\/ul>\n\n<p>Ap\u00f3s uma an\u00e1lise minuciosa, preferimos seguir com o OPA, em vez do Oso Cloud, devido a alguns fatores:<\/p>\n<ul>\n<li>o Oso \u00e9 menos flex\u00edvel e a migra\u00e7\u00e3o das nossas policies atuais seria mais trabalhosa.<\/li>\n<li>o Oso \u00e9 um SaaS e tem um custo associado; com nosso volume de requests esse custo pode ser bem significativo.<\/li>\n<li>o Oso tem uma UI para edi\u00e7\u00e3o de policies, mas para escrever ABAC \/ ReBAC \u00e9 preciso escrever as regras na linguagem Polar.<\/li>\n<\/ul>\n\n<p>Por outro lado, o OPA tem v\u00e1rias caracter\u00edsticas que o tornam uma boa op\u00e7\u00e3o para a gente. \u00c9 open-source, utilizado por algumas grandes empresas, flex\u00edvel e orientado \u00e0 nuvem. \u00c9 escrito em Golang, altamente perform\u00e1tico e capaz de responder a um grande volume de requests de Autoriza\u00e7\u00e3o na casa dos milissegundos \u2013 caracter\u00edstica essencial para nosso caso, pois ter\u00edamos que externalizar as chamadas de autoriza\u00e7\u00e3o, j\u00e1 pagando o custo de lat\u00eancia de rede.<\/p>\n<p>Outra caracter\u00edstica que tornava o OPA mais atrativo era que as regras s\u00e3o escritas na linguagem <a href=\"https:\/\/www.openpolicyagent.org\/docs\/latest\/policy-language\/\">Rego<\/a> , que apesar de n\u00e3o ser t\u00e3o simples \u00e9 flex\u00edvel o bastante para implementar RBAC, ABAC, ReBAC e outros tipos de controle de acesso. As regras e dados de autoriza\u00e7\u00e3o s\u00e3o alimentados no servi\u00e7o e ficam dispon\u00edveis em mem\u00f3ria, e podem ser substitu\u00eddos em tempo de execu\u00e7\u00e3o.<\/p>\n<p>Al\u00e9m disso, o usu\u00e1rio do OPA \u00e9 quem define o formato do input (os dados de autoriza\u00e7\u00e3o relativos a um dado request) e o formato do output (quais permiss\u00f5es s\u00e3o calculadas e retornadas), ent\u00e3o ele pode ser usado em mais de um contexto.<\/p>\n\n<p>Al\u00e9m de tudo isso, h\u00e1 um forte <a href=\"https:\/\/www.openpolicyagent.org\/ecosystem\/\">ecossistema<\/a> em torno do OPA, com v\u00e1rias ferramentas constru\u00eddas para facilitar sua ado\u00e7\u00e3o em escala, e at\u00e9 mesmo uma vers\u00e3o <a href=\"https:\/\/www.styra.com\/enterprise-opa\/\">Enterprise<\/a>.<\/p>\n\n<h2>Como o OPA endere\u00e7a nossos problemas<\/h2>\n<ul>\n<li><strong>Acoplamento com o Data-Layer<\/strong>: o deploy de novas policies \u00e9 feito diretamente no OPA e n\u00e3o precisa nem redeployar o servi\u00e7o, pois ele tem suporte a hot-reload (apontando para um bucket do S3, por exemplo). O OPA pode tamb\u00e9m ter uma base de dados de Autoriza\u00e7\u00e3o, que torna mais simples a implementa\u00e7\u00e3o de ReBAC em vez de ficar buscando esses dados em real-time no momento do request.<\/li>\n<li><strong>Testes<\/strong>: toda policy pode e deve ser testada unitariamente; os testes s\u00e3o r\u00e1pidos e podem ser inclu\u00eddos na sua pipe de CI. Em termos de garantir que os dados esperados s\u00e3o efetivamente enviados para o OPA, essa responsabilidade fica com os testes do seu sistema.<\/li>\n<li><strong>Isolamento (\u201csiloing\u201d)<\/strong>: infelizmente o OPA n\u00e3o resolve este ponto muito bem, pois \u00e9 necess\u00e1rio escrever c\u00f3digo e n\u00e3o h\u00e1 UI que facilite o processo. Mas um ponto positivo \u00e9 que quem cuida das policies n\u00e3o precisa ser o mesmo time dono dos dados, pode ser um time focado nisso.<\/li>\n<li><strong>Escopo<\/strong>: dependendo de como forem escritas as regras, pode-se usar um mesmo servidor do OPA para atender a requests de Autoriza\u00e7\u00e3o de v\u00e1rias fontes. Na Alice, conseguimos escrever de uma forma que a mesma regra calcula permiss\u00f5es para o front-end (quando tenho dados somente do usu\u00e1rio acessando) e para o back-end (quando tenho as demais informa\u00e7\u00f5es de recurso e a\u00e7\u00e3o, por exemplo).<\/li>\n<\/ul>\n\n<h2>Conclus\u00e3o<\/h2>\n<p>Apesar de ser um problema bastante comum no desenvolvimento de sistemas, pode ser desafiador encontrar uma solu\u00e7\u00e3o de Autoriza\u00e7\u00e3o que case bem com as suas necessidades. \u00c9 importante estudar com calma as alternativas, realizar Provas de Conceito em escopos menores e ter um bom plano de migra\u00e7\u00e3o quando j\u00e1 h\u00e1 bastante coisa constru\u00edda no esquema atual.<\/p>\n\n<p>Esse \u00e9 o tipo de problema que faz muito sentido ser endere\u00e7ado pelo <strong>time de Plataforma,<\/strong> pois causa um grande impacto ao longo de todas as camadas de desenvolvimento, e precisa de grande apoio das lideran\u00e7as para efetivamente sair do papel.<\/p>\n\n<h1>&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;-<\/h1>\n\n<p>Alice is a technology company with the mission of making the world healthier. But like any tech company, it faces common challenges and must decide how to address them. This article explains some of the authorization-related problems we encountered, explores the alternatives we considered, and shows how the solution we chose solves these problems (while inevitably creating others as well ).<\/p>\n<h2><b>What is Authorization? How is it Different from Authentication?<\/b><\/h2>\n<p>Before diving into the details, it\u2019s important to recall the difference between Authentication and Authorization\u2014two concepts that often go together but are fundamentally different.<\/p>\n<p>In short, <b>Authentication<\/b> is the process of identifying a user, ensuring that they are who they claim to be. <b>Authorization<\/b>, on the other hand, is the process of determining whether an identified (or even unidentified) user has permission to perform certain actions within the system.<\/p>\n<p>The solutions and frameworks available may handle one or both aspects, which is important to consider when making a choice. You might, for example, be forced to use a solution\u2019s Authentication component just to make its Authorization component work. Depending on the case (as was true for Alice), this may not be desirable.<\/p>\n<h2><b>Common Types of Authorization<\/b><\/h2>\n<p>There are several types of Authorization, covering most of the common needs of modern systems. Here are the main ones:<\/p>\n<ul>\n<li><b>Role-Based Access Control (RBAC)<\/b>: The most common type of access control, in which roles are assigned to users, defining what each role can do. Roles can be assigned or revoked at any time, and the system adjusts behavior accordingly.\n<ul>\n<li><i>Example<\/i>: Bob is assigned the role of Operations Analyst and gains the ability to edit any Member (as we call the patients here in Alice) in the system.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n<ul>\n<li><b>Attribute-Based Access Control (ABAC)<\/b>: Access control based on user attributes and\/or the attributes of the resource being accessed.\n<ul>\n<li><i>Example<\/i>: Bob can edit a Member in the system if his user attribute isAdmin = true, or if the Member has the attribute isPublic = true.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n<ul>\n<li><b>Relationship-Based Access Control (ReBAC)<\/b>: A specific case of ABAC where permission is granted based on a specific relationship between the user and the accessed resource.\n<ul>\n<li><i>Example<\/i>: Bob can edit a Member\u2019s data if the record represents himself or one of his dependents.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n\n<p>A system may require Authorization at any of these levels. In Alice\u2019s case, most rules follow RBAC, with some cases requiring ABAC and ReBAC. This means the chosen solution must support these Authorization models\u2014RBAC alone wouldn\u2019t be sufficient (or would require excessive workarounds).<\/p>\n<h2><b>Our Initial Approach to Authorization<\/b><\/h2>\n<p>As a healthcare company, Alice deals extensively with personal and medical information, making a robust Authorization mechanism essential to ensure that data is accessed or modified only by authorized individuals\u2014whether doctors, nurses, or operational support teams.<\/p>\n<p>Initially, we decided to implement Authorization within our shared Data-Layer, which already handled tasks like tokenizing records, de-identifying data, and other privacy and security measures. Using a fluid Domain Specific Language (code homebrewed for this purpose), we evaluated four key parameters to make Authorization decisions:<\/p>\n<ul>\n<li><b>Root service<\/b>: The service where the request originated (important because a user might have different permissions in different systems).<\/li>\n<li><b>Subject<\/b>: The current user.<\/li>\n<li><b>Resource<\/b>: The resource being accessed.<\/li>\n<li><b>Action<\/b>: The action the user wants to perform on the resource (CRUD: Create, Read, Update, Delete).<\/li>\n<\/ul>\n<p>We also followed the <b>Least Privilege<\/b> principle, meaning access must be explicitly granted via written Policies in the DSL\u2014otherwise, access is denied by default. These rules were deployed alongside the Data-Layer, requiring a new production release for any changes to take effect.<\/p>\n<h2><b>Problems<\/b><\/h2>\n<p>While this approach gave us flexibility in Authorization decisions, it also introduced some drawbacks:<\/p>\n<ul>\n<li><b>Tight coupling with the Data-Layer<\/b>: Policies could not be changed without redeploying the service; some domain rules accessed data from other domains directly, breaking encapsulation.<\/li>\n<li><b>Testing challenges<\/b>: Writing tests for policies wasn\u2019t trivial, leading to frequent runtime errors when missing a necessary policy.<\/li>\n<li><b>Expertise<\/b>: Policy modifications were highly technical and could only be done by backend developers\u2014there was no UI or other tooling to facilitate this.<\/li>\n<li><b>Scope limitations<\/b>: The mechanism only covered data access, meaning we couldn\u2019t use it for UI-based authorization (e.g., controlling which UI elements should be displayed based on a user\u2019s role).<\/li>\n<\/ul>\n<p>With these challenges in mind, we looked for an Authorization solution that met our needs while mitigating as many of these issues as possible.<\/p>\n<h2><b>Considered Alternatives<\/b><\/h2>\n<p>A key requirement in our search: we had no intention of changing our existing Authentication mechanism. This meant solutions that bundled Authentication and Authorization together (such as <a href=\"https:\/\/www.keycloak.org\/\">Keycloak<\/a> or <a href=\"https:\/\/www.aserto.com\/\">Aserto<\/a>) wouldn\u2019t work for us.<\/p>\n<p>Instead, we found two alternatives that better aligned with our needs:<\/p>\n<ul>\n<li><a href=\"https:\/\/www.osohq.com\/docs\"><b>Oso Cloud<\/b><\/a><\/li>\n<li><a href=\"https:\/\/www.openpolicyagent.org\/\"><b>Open Policy Agent (OPA)<\/b><\/a><\/li>\n<\/ul>\n<p>After a thorough analysis, we decided to go with OPA instead of Oso Cloud for several reasons:<\/p>\n<ul>\n<li>Oso is less flexible, and migrating our existing policies would be more complex.<\/li>\n<li>Oso is a SaaS solution with associated costs, which could be significant given our request volume.<\/li>\n<li>Oso provides a UI for policy editing, but writing ABAC\/ReBAC rules still requires using the Polar language.<\/li>\n<\/ul>\n<p>On the other hand, OPA has several characteristics that make it a great option for us. It is open-source, used by some large companies, flexible, and cloud-oriented. It is written in Golang, highly performant, and capable of handling a high volume of authorization requests in milliseconds\u2014an essential feature for our case since we needed to externalize authorization calls while already accounting for network latency costs.<\/p>\n<p>Policies are written in the <a href=\"https:\/\/www.openpolicyagent.org\/docs\/latest\/policy-language\/\">Rego<\/a> language, which, although not the simplest, is flexible enough to implement RBAC, ABAC, ReBAC, and other access control models. Authorization rules and data are fed into the service, stored in memory, and can be replaced at runtime.<\/p>\n<p>OPA users define the input format (the authorization data related to a given request) and the output format (which permissions are calculated and returned), allowing it to be used in multiple contexts.<\/p>\n<p>Beyond all this, OPA has a strong <a href=\"https:\/\/www.openpolicyagent.org\/ecosystem\/\">ecosystem<\/a>, with various tools built to facilitate large-scale adoption and even an <a href=\"https:\/\/www.styra.com\/enterprise-opa\/\">Enterprise<\/a> version.<\/p>\n<h2><b>How OPA Solves Our Problems<\/b><\/h2>\n<ul>\n<li><b>Decoupling from the Data-Layer<\/b>: Policies are deployed directly to OPA, eliminating the need to redeploy the service. OPA also supports an Authorization database, making it easier to implement ReBAC without real-time data lookups.<\/li>\n<li><b>Improved Testing<\/b>: Policies can and should be unit tested, with fast execution that integrates into CI pipelines. Ensuring the right data reaches OPA remains the responsibility of system tests.<\/li>\n<li><b>Less Expertise<\/b>: While OPA still requires writing code (lacking a UI for policy management), policy ownership and authoring can be assigned to a dedicated team rather than the teams managing the data itself.<\/li>\n<li><b>Expanded Scope<\/b>: A single OPA instance can handle Authorization requests from multiple sources. At Alice, we structured our policies so the same rule could determine permissions for both the frontend (based on user attributes) and the backend (considering additional resource and action information).<\/li>\n<\/ul>\n<h2><b>Conclusion<\/b><\/h2>\n<p>Despite being a common challenge in system development, finding an Authorization solution that fits your needs can be difficult. It&#8217;s crucial to carefully study alternatives, run Proofs of Concept in limited scopes, and have a solid migration plan when transitioning from an existing system.<\/p>\n<p>This is the kind of problem that makes sense to be handled by a <b>Platform Team<\/b>, as it impacts all layers of development and requires strong leadership support to be successfully implemented.<\/p>\n\n\n","protected":false},"excerpt":{"rendered":"Como os times de engenharia da Alice trabalharam para lidar com os problemas relativos a Autoriza\u00e7\u00e3o e como a solu\u00e7\u00e3o que escolhemos nos ajuda a resolv\u00ea-los.","protected":false},"author":1,"featured_media":236,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[1],"tags":[],"class_list":["post-225","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-alice"],"acf":[],"_links":{"self":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/225","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/comments?post=225"}],"version-history":[{"count":11,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/225\/revisions"}],"predecessor-version":[{"id":247,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/posts\/225\/revisions\/247"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/media\/236"}],"wp:attachment":[{"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/media?parent=225"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/categories?post=225"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/alice.com.br\/tech\/wp-json\/wp\/v2\/tags?post=225"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}