{"id":632,"date":"2017-04-26T18:00:00","date_gmt":"2017-04-26T18:00:00","guid":{"rendered":"https:\/\/geoadmin.com.br\/?p=632"},"modified":"2021-06-09T10:25:23","modified_gmt":"2021-06-09T13:25:23","slug":"integrando-o-django-com-o-ad-microsogt","status":"publish","type":"post","link":"https:\/\/geoadmin.com.br\/?p=632","title":{"rendered":"Integrando o Django com o AD Microsoft"},"content":{"rendered":"<p>Em um projeto novo da SIGMA, nos foi solicitado que utiliz\u00e1ssemos<br \/>\nos usu\u00e1rios registrados no <em>Active Directory<\/em> do cliente, significando<br \/>\nque ter\u00edamos de integrar toda a funcionalidade de login do nosso projeto<br \/>\nDjango com este camarada.<\/p>\n<p>Existem diversas raz\u00f5es para esta integra\u00e7\u00e3o, principalmente no nosso<br \/>\ncaso, em que o cliente final \u00e9 uma grande empresa, com toda uma infraestrutura<br \/>\nde Tecnologia da Informa\u00e7\u00e3o bastante s\u00f3lida e madura.<\/p>\n<p>Entre estas raz\u00f5es, se encontram, em ordem de prioridade:<\/p>\n<ol>\n<li>Cliente n\u00e3o quer <strong>mais um usu\u00e1rio\/senha<\/strong> para usar um sistema especialista;<\/li>\n<li>Equipe de TI n\u00e3o quer gerenciar os cadastros dos usu\u00e1rios em mais um sistema;<\/li>\n<li>Economia no desenvolvimento, de tempo e dinheiro;<\/li>\n<\/ol>\n<h2>Como funciona?<\/h2>\n<p>O Django, como um framework, j\u00e1 possui toda um maquin\u00e1rio importante para<br \/>\ncria\u00e7\u00e3o e manuten\u00e7\u00e3o de permiss\u00f5es e grupos. Mas existe uma &#8220;pegadinha&#8221;:<br \/>\no usu\u00e1rio em quest\u00e3o precisa existir no banco de dados que estamos usando.<\/p>\n<p>Isto porque as permiss\u00f5es e grupos est\u00e3o armazenadas em um banco de dados<br \/>\nrelacional e existem rela\u00e7\u00f5es com chaves estrangeiras entre usu\u00e1rios, permiss\u00f5es<br \/>\ne grupos.<\/p>\n<p>O fluxo mais simples, portanto \u00e9:<\/p>\n<ol>\n<li>Usu\u00e1rio se autentica com a senha do <em>Active Directory<\/em>;<\/li>\n<li>Usu\u00e1rio est\u00e1 inativo no <em>AD<\/em>? Caso esteja, impe\u00e7a o login e inative o usu\u00e1rio local;<\/li>\n<li>Usu\u00e1rio n\u00e3o est\u00e1 inativo, confira a senha;<\/li>\n<li>Sistema confere se o usu\u00e1rio j\u00e1 existe na base local;<\/li>\n<li>Caso ele j\u00e1 exista, ok, n\u00e3o fa\u00e7a mais nada;<\/li>\n<li>Caso ele n\u00e3o exista, copie os dados do usu\u00e1rio e crie um novo usu\u00e1rio na base local;<\/li>\n<li>Associe permiss\u00f5es\/grupos;<\/li>\n<li>Vit\u00f3ria;<\/li>\n<\/ol>\n<p>Seguindo este fluxo, todos os componentes do Django continuam a funcionar e n\u00e3o<br \/>\nprecisamos criar permiss\u00f5es remotas no <em>AD<\/em> (ou <em>LDAP<\/em>) o que tornaria tudo<br \/>\nmais complicado de administrar (pense nas migra\u00e7\u00f5es do Django).<\/p>\n<p>Outro ponto importante, delimitador deste fluxo, \u00e9 a necessidade das sess\u00f5es HTTP<br \/>\nno Django. Sem existir um usu\u00e1rio na base, n\u00e3o conseguiremos manter as sess\u00f5es. Ter\u00edamos<br \/>\nde adaptar tamb\u00e9m o componente que registra e valida as sess\u00f5es ativas.<\/p>\n<p>Portanto esta arquitetura de c\u00f3pia de usu\u00e1rios \u00e9 a mais comum para integra\u00e7\u00e3o<br \/>\nem bases de usu\u00e1rios &#8220;remotas&#8221; (este fluxo tamb\u00e9m \u00e9 usado em pacotes que realizam<br \/>\nautentica\u00e7\u00e3o e integra\u00e7\u00e3o com outros provedores de login, como OAuth2, por exemplo).<\/p>\n<h2>Como realizar a integra\u00e7\u00e3o?<\/h2>\n<p>Felizmente, o Django \u00e9 um projeto bastante modular. Neste caso em espec\u00edfico,<br \/>\no Django aceita a configura\u00e7\u00e3o de <code>settings<\/code> de autentica\u00e7\u00e3o, permitindo<br \/>\ninclusive a autentica\u00e7\u00e3o em m\u00faltiplos backends, em cascata. Caso a autentica\u00e7\u00e3o<br \/>\ndo usu\u00e1rio n\u00e3o funcione em um backend, ele tenta no pr\u00f3ximo.<\/p>\n<p>A arquitetura do Django facilitou bastante nossa vida neste sentido.<\/p>\n<p>Quais s\u00e3o os passos:<\/p>\n<p>Configurar o <code>AUTHENTICATION_BACKENDS<\/code> em seus <code>settings.py<\/code><\/p>\n<p>Desenvolver ou reutilizar um pacote <strong>open-source<\/strong> que j\u00e1 faz a conex\u00e3o<br \/>\ne valida\u00e7\u00e3o do usu\u00e1rio no <em>Active Directory<\/em>. No nosso caso, utilizamos o<br \/>\n<a href=\"https:\/\/github.com\/etianen\/django-python3-ldap\">django-python3-ldap<\/a>.<\/p>\n<p>Configurar as vari\u00e1veis do django-python3-ldap:<\/p>\n<pre><code># settings.py\nLDAP_AUTH_USER_FIELDS = {\n  \"username\": \"uid\",\n  \"first_name\": \"givenName\",\n  \"last_name\": \"sn\",\n  \"email\": \"mail\",\n}\nLDAP_AUTH_USER_LOOKUP_FIELDS = (\"username\",)\nLDAP_AUTH_CLEAN_USER_DATA = \"django_python3_ldap.utils.clean_user_data\"\nLDAP_AUTH_SYNC_USER_RELATIONS = \"jango_python3_ldap.utils.sync_user_relation\"\n\"  LDAP_AUTH_FORMAT_SEARCH_FILTERS = \"django_python3_ldap.utils.format_search_filters\"\n# Aten\u00e7\u00e3o neste ponto, pois ele \u00e9 necess\u00e1rio para funcionar com o AD\nLDAP_AUTH_FORMAT_USERNAME = \"django_python3_ldap.utils.format_username_active_directory\"```\n<\/code><\/pre>\n<p>Para a url indique conforme abaixo substituindo <code>&lt;ip_ou_dominio&gt;<\/code><br \/>\npor seu ip ou dominio:<\/p>\n<pre><code># settings.py\nLDAP_AUTH_URL='ldap:\/\/&lt;ip_ou_dominio&gt;:389'\n<\/code><\/pre>\n<p>Utilize o comando dsquery user no ms-dos para obter a seguinte informa\u00e7\u00e3o informa\u00e7\u00e3o:<\/p>\n<pre><code>C:\\Users\\csantos&gt;dsquery user\n\"CN=Claudio Santos,CN=Users,DC=server,DC=local\"\n\"CN=Guest,CN=Users,DC=server,DC=local\"\n<\/code><\/pre>\n<p>Utilize os tr\u00eas crit\u00e9rios de pesquisa, resultando em: <code>LDAP_AUTH_SEARCH_BASE = 'CN=Users,DC=server,DC=local'<\/code><\/p>\n<p>Comumente temos dois tipos de usu\u00e1rios: <code>InetOrgPerson<\/code> ou <code>Users<\/code>. N\u00f3s utilizamos o <code>Users<\/code>,<br \/>\nconfigurando <code>LDAP_AUTH_OBJECT_CLASS = 'Users'<\/code><\/p>\n<p>Configure este settings com uma vari\u00e1vel que podemos pegar na<br \/>\ntela de cria\u00e7\u00e3o de usu\u00e1rio no campo em destaque na imagem,<br \/>\nela representa o <code>Pre-Windows 2000 Domain Name do Active Directory<\/code>:<\/p>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/sigmageosistemas.com.br\/media\/upload\/blog-django-ad-create-users.png?w=950&#038;ssl=1\" alt=\"attribute-editor-uid\" \/><\/p>\n<pre><code># settings.py\nLDAP_AUTH_ACTIVE_DIRECTORY_DOMAIN = 'SERVER'\n<\/code><\/pre>\n<p>Por fim v\u00e1 em <code>Active Directory Users and Computer<\/code>, v\u00e1 na pasta <code>Users<\/code>,<br \/>\nem seguida, clique com o bot\u00e3o direito, propriedades e por fim na aba <code>Atributte Editor<\/code><br \/>\ninforme o login do usu\u00e1rio no atributo uid, como mostrado na imagem abaixo;<\/p>\n<p><img data-recalc-dims=\"1\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/sigmageosistemas.com.br\/media\/upload\/blog-django-ad-uid.png?w=950&#038;ssl=1\" alt=\"attribute-editor-uid\" \/><\/p>\n<h2>Conclus\u00f5es<\/h2>\n<p>N\u00e3o vou discorrer aqui sobre os benef\u00edcios t\u00e9cnicos de usar open-source ou<br \/>\ncoisa do tipo, mas sim dos benef\u00edcios gerados por uma integra\u00e7\u00e3o deste n\u00edvel.<\/p>\n<p>As vantagens auferidas tem um profundo impacto psicol\u00f3gico sobre o usu\u00e1rio final<br \/>\ne sobre o retorno sobre investimento.<\/p>\n<p>Em primeiro lugar, o sistema parece ter sido constru\u00eddo e fazer parte de fato<br \/>\nde toda a organiza\u00e7\u00e3o. O usu\u00e1rio n\u00e3o tem a impress\u00e3o de sair de seu ambiente tecnol\u00f3gico,<br \/>\nconfort\u00e1vel e seguro, para trabalhar em um sistema externo.<\/p>\n<p>Como segundo ponto, o usu\u00e1rio tem uma barreira menor para utilizar o sistema.<br \/>\nA ado\u00e7\u00e3o de novos sistemas em organiza\u00e7\u00f5es grandes sempre foi e sempre ser\u00e1<br \/>\numa dificuldade, pelo pr\u00f3prio fator humano. Como a barreria de in\u00edcio \u00e9 menor,<br \/>\nmaior ser\u00e1 a ado\u00e7\u00e3o dos usu\u00e1rios.<\/p>\n<p>Em terceiro lugar, mas consequ\u00eancia do segundo ponto, quanto maior a ado\u00e7\u00e3o<br \/>\ndos usu\u00e1rios, maior o impacto que o novo sistema ter\u00e1 na organiza\u00e7\u00e3o, trazendo<br \/>\num retorno maior para os <em>stakeholders<\/em> do projeto.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Em um projeto novo da SIGMA, nos foi solicitado que utiliz\u00e1ssemos os usu\u00e1rios registrados no Active Directory do cliente, significando que ter\u00edamos de integrar toda a funcionalidade de login do nosso projeto Django com este camarada. Existem diversas raz\u00f5es para esta integra\u00e7\u00e3o, principalmente no nosso caso, em que o cliente final \u00e9 uma grande empresa, &hellip; <\/p>\n<p class=\"link-more\"><a href=\"https:\/\/geoadmin.com.br\/?p=632\" class=\"more-link\">Leia mais<span class=\"screen-reader-text\"> &#8220;Integrando o Django com o AD Microsoft&#8221;<\/span><\/a><\/p>\n","protected":false},"author":6,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_post_was_ever_published":false},"categories":[1],"tags":[51,30,29,53,45,52],"class_list":["post-632","post","type-post","status-publish","format-standard","hentry","category-sem-categoria","tag-agil","tag-desenvolvimento-de-sistemas","tag-dev","tag-django","tag-python","tag-scrum"],"jetpack_sharing_enabled":true,"jetpack_featured_media_url":"","_links":{"self":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/632","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/users\/6"}],"replies":[{"embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=632"}],"version-history":[{"count":1,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/632\/revisions"}],"predecessor-version":[{"id":1320,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=\/wp\/v2\/posts\/632\/revisions\/1320"}],"wp:attachment":[{"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=632"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=632"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/geoadmin.com.br\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=632"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}