<div dir="ltr"><div dir="ltr"><div dir="ltr"><div dir="ltr">Hi, <br><br><div class="gmail_quote"><div dir="ltr">On Wed, Oct 10, 2018 at 3:42 PM Attila Bárdi <<a href="mailto:attila.bardi@gmail.com" target="_blank">attila.bardi@gmail.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr">Hey,<div><br></div><div>I used Ldap with Dancer and it works pretty fine. Now I want to develop a new microsite, I thought it would be better with Dancer2(0.206000). But I cannot make the Ldap (0.702) authentication to work.</div><div><br></div><div>I turned on the ldap logging. By the log It looks working, because it found the user, but the page says login failed. The second search for the groups has 0 match, the user doesn't member of any group. But I can log in with the user foo, and he is not a member of any group neither. The result is LOGIN FAILED.</div></div></div></blockquote><div><br></div><div>As far as I understand You'd like role-based access control for your app, where roles are actually ldap groups. I.e. uid belongs to a group <=> has a role.</div><div>Now you have to decide what exactly will contain the roles. In unix a user can have 1 primary group and multiple secondary groups.</div><div>IMHO it is more flexible to check for members of the secondary groups, which may have the following format in case of openldap:<br></div><div><br></div><div>objectClass: posixGroup<br>displayName: powerusers<br>description: "members have role users"<br>gidNumber: 1001<br>cn: powerusers<br>memberUid: user1<br>memberUid: user2</div><div>memberUid: ...</div><div><br></div><div>If you'd like to check for the primary group then you'll probably will need to check for gidNumber.. <br></div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div><br></div><div>In the Dancer2 log says:</div><div><br></div><div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Odd number of elements in anonymous hash at /usr/local/share/perl/5.24.1/Dancer2/Plugin/Auth/Extensible/Provider/LDAP.pm line 279.</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"></div><div><br></div><div>OpenLdap log:</div><div><br></div><div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 fd=106 ACCEPT from IP=a.b.c.d:47724 (IP=<a href="http://0.0.0.0:389" target="_blank">0.0.0.0:389</a>)</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 op=0 BIND dn="cn=Administrator,dc=gothamcity,dc=example,dc=com" method=128</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 op=0 BIND dn="cn=Administrator,dc=gothamcity,dc=example,dc=com" mech=SIMPLE ssf=0</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 op=0 RESULT tag=97 err=0 text=</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 op=1 SRCH base="dc=example,dc=com" scope=2 deref=2 filter="(&(objectClass=inetOrgPerson)(uid=battila))"</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 op=2 SRCH base="dc=example,dc=com" scope=2 deref=2 filter="(&(objectClass=groupOfNames)(member=uid=battila,ou=people,dc=gothamcity,dc=example,dc=com))"</span></div></div></div></blockquote><div><br></div><div>This seem to be the problem, this LDAP plugin as far as I see is intended to be used with WindowsAD.</div><div>The searchfilter above is simply not applicable for your case. In case of openldap</div><div> rolefilter would be rather memberUID: $uid instead of member=uid=$uid,ou=blabla,dc=....<br></div><div>It is also hardcoded into the plugin:</div><div><a href="https://metacpan.org/source/SYSPETE/Dancer2-Plugin-Auth-Extensible-Provider-LDAP-0.702/lib/Dancer2/Plugin/Auth/Extensible/Provider/LDAP.pm" target="_blank">https://metacpan.org/source/SYSPETE/Dancer2-Plugin-Auth-Extensible-Provider-LDAP-0.702/lib/Dancer2/Plugin/Auth/Extensible/Provider/LDAP.pm</a><br></div><div>Lines 256-264:</div><div><pre id="gmail-m_5886976781167629342gmail-source" class="gmail-m_5886976781167629342gmail-line-numbers gmail-m_5886976781167629342gmail-pod-toggle gmail-m_5886976781167629342gmail-pod-hidden"><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number256 gmail-m_5886976781167629342gmail-index255 gmail-m_5886976781167629342gmail-alt1"><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-spaces">        </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-comments"># now get the roles</code></div><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number257 gmail-m_5886976781167629342gmail-index256 gmail-m_5886976781167629342gmail-alt2"> </div><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number258 gmail-m_5886976781167629342gmail-index257 gmail-m_5886976781167629342gmail-alt1"><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-spaces">        </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-variable">$mesg</code> <code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">= </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-variable">$ldap</code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">->search(</code></div><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number259 gmail-m_5886976781167629342gmail-index258 gmail-m_5886976781167629342gmail-alt2"><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-spaces">            </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-string">base</code>   <code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">=> </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-variable">$self</code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">->basedn,</code></div><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number260 gmail-m_5886976781167629342gmail-index259 gmail-m_5886976781167629342gmail-alt1"><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-spaces">            </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-string">filter</code> <code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">=> </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-string">'(&'</code></div><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number261 gmail-m_5886976781167629342gmail-index260 gmail-m_5886976781167629342gmail-alt2"><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-spaces">              </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">. </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-variable">$self</code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">->role_filter . </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-string">'('</code></div><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number262 gmail-m_5886976781167629342gmail-index261 gmail-m_5886976781167629342gmail-alt1"><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-spaces">              </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">. </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-variable">$self</code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">->role_member_attribute . </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-string">'='</code></div><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number263 gmail-m_5886976781167629342gmail-index262 gmail-m_5886976781167629342gmail-alt2"><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-spaces">              </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">. </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-variable">$entry</code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">->dn . </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-string">'))'</code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">,</code></div><div class="gmail-m_5886976781167629342gmail-line gmail-m_5886976781167629342gmail-number264 gmail-m_5886976781167629342gmail-index263 gmail-m_5886976781167629342gmail-alt1"><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-spaces">        </code><code class="gmail-m_5886976781167629342gmail-perl gmail-m_5886976781167629342gmail-plain">);</code></div></pre></div><div>But the good thing is that you can simply change that :) <br></div><div><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div dir="ltr"><div><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 op=2 SEARCH RESULT tag=101 err=0 nentries=0 text=</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 op=3 UNBIND</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Oct 10 14:35:13 openldap01 slapd[991]: conn=674413 fd=106 closed</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br>User entry in the openldap:</div><div><br></div><div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">dn: uid=battila,ou=people,dc=gothamcity,dc=example,dc=com</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">cn: Attila Bardi</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">gidNumber: 1901</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">givenName: Attila</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">loginShell: /bin/bash</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">description: example</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">objectClass: top</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">objectClass: posixAccount</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">objectClass: shadowAccount</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">objectClass: inetOrgPerson</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">shadowInactive: -1</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">shadowLastChange: 14284</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">shadowMax: 99999</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">shadowMin: 0</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">shadowWarning: 7</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">sn: Bardi</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">uid: battila</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">uidNumber: 43821</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">homeDirectory: /home/battila</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">mail:<span class="gmail-m_5886976781167629342gmail-m_-4693494529859491126gmail-Apple-converted-space"> </span></span><a href="mailto:battila@example.com" style="font-family:Helvetica;font-size:12px" target="_blank">battila@example.com</a><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">structuralObjectClass: inetOrgPerson</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">entryUUID: d3a89750-5a5e-1038-9b9a-dbf2c7148bb9</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">creatorsName: cn=Administrator,dc=gothamcity,dc=example,dc=com</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">createTimestamp: 20181002071629Z</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">userPassword:: e1e1ee1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">entryCSN: 20181002075005.324787Z#000000#000#000000</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">modifiersName: uid=battila,ou=people,dc=gothamcity,dc=example,dc=com</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">modifyTimestamp: 20181002075005Z</span><br><br><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">Dancer2 config.yml<br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">plugins:</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">       Auth::Extensible:</span></div><div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">               realms:</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                       config:</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               provider: Config</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               users:</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                                       - user: 'foo'</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                                         pass: 'secret'</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                       users:</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               provider: LDAP</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               host:   'openldap01'</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               binddn: 'cn=Administrator,dc=gothamcity,dc=example,dc=com'</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               bindpw: 'secret'</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               basedn: 'dc=example,dc=com'</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               user_filter: '(objectClass=inetOrgPerson)'</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">                               username_attribute: "uid"</span><br style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"></div><div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><br></span></div><div><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px">I tried </span><span style="color:rgb(0,0,0);font-family:Helvetica;font-size:12px"><i>disable_roles: 1 </i>after this but the result is still LOGIN FAILED.</span></div><br></div></div></blockquote><div><br></div><div>Another thing which in my opinion is plain wrong is that you need to provide admin binddn and bindpw.</div><div>In openldap world normally a user can bind itself and get all the necessary attributes.</div><div>Also in many setups it is just not secure to give admin access to ldap tree to a web app.</div><div><br></div><div>Here is the plugin for Dancer1 which works with openldap without admin access:<br></div><div><a href="https://pastebin.com/vy9ea9P8">https://pastebin.com/vy9ea9P8</a></div><div>May be it will give you some hints, though it is easier to fix the original Dancer2 plugin.</div><br></div><div class="gmail_quote">Best, <br></div><div class="gmail_quote">Alex<br></div><div class="gmail_quote"><br></div></div></div></div></div>