<div dir="ltr">This is my implementation using LDAP and Kerberos. As you can see I validate Admin separately, but definitively it can be modify to suit Brian workflow.<br>I hope this helps,<br><br>Denis<br><br>PS: do not hesitate in suggesting improvements! :D<br><br>$c-&gt;{check_user_password} = sub {<br>   my( $session, $username, $password ) = @_;<br>   <br>   # Kerberos authentication for &quot;user&quot;, &quot;editor&quot; and &quot;admin&quot; types (roles)<br>   <br>   use Net::LDAP; # IO::Socket::SSL also required<br>   use Authen::Krb5::Simple;<br>   use Authen::SASL;<br>   <br>   # LDAP tunables<br>   my $ldap_host = “ldap.xxx.xxx&quot;;<br>   my $base      = “OU=xx,DC=xx,DC=xx,DC=xx,DC=xx&quot;;<br>   my $proxy_user =&quot;ad_read&quot;;<br>   my $dn        = &quot;CN=$proxy_user,$base&quot;;<br><br>   # Kerberos tunables<br>   my $krb_host = “xxx.xxx.xxx&quot;;<br>   <br>   my $krb       = Authen::Krb5::Simple-&gt;new(realm =&gt; $krb_host);<br>   unless ( $krb )<br>   {<br>    print STDERR &quot;Kerberos error: $@\n&quot;;<br>    return 0;<br>   }<br><br>   my $ldap      = Net::LDAP-&gt;new ( $ldap_host );<br>   unless( $ldap )<br>   {<br>       print STDERR &quot;LDAP error: $@\n&quot;;<br>       return 0;<br>   }<br>   <br>   my $sasl = Authen::SASL-&gt;new(<br>          mechanism =&gt; &#39;GSSAPI&#39;, <br>          callback =&gt; { user =&gt; &#39;ad_read&#39; }<br>        ) or die &quot;$@&quot;;<br><br>   my $mesg = $ldap-&gt;bind(sasl =&gt; $sasl);# dn =&gt; $dn, password=&gt;$ldappass );<br><br>   if( $mesg-&gt;code() )<br>   {<br>       print STDERR &quot;LDAP Bind error: &quot; . $mesg-&gt;error() . &quot;\n&quot;;<br>       return 0;<br>   }<br><br>   # Distinguished name (and attribues needed later on) for this user<br>   my $result = $ldap-&gt;search (<br>       base    =&gt; &quot;$base&quot;,<br>       filter  =&gt; &quot;(&amp;(sAMAccountName=$username))&quot;,<br>       attrs   =&gt;  [&#39;1.1&#39;, &#39;uid&#39;, &#39;sn&#39;, &#39;givenname&#39;, &#39;mail&#39;],<br>       sizelimit=&gt;1<br>   );<br><br>   my $entr = $result-&gt;pop_entry;<br>   unless( defined $entr )<br>   {<br>       # Allow local EPrints authentication for admins (accounts not found in LDAP)<br>       my $user = EPrints::DataObj::User::user_with_username( $session, $username );<br>       return 0 unless $user;<br><br>       my $user_type = $user-&gt;get_type;<br>       if( $user_type eq &quot;admin&quot; )<br>       {<br>           # internal authentication for &quot;admin&quot; type<br>           return $session-&gt;get_database-&gt;valid_login( $username, $password );<br>       }<br>       return 0;<br>   }<br><br>   <br>   # Check password<br>   if( !$krb-&gt;authenticate( $username, $password ) )<br>   {<br>    print STDERR &quot;$username authentication failed: &quot;, $krb-&gt;errstr(), &quot;\n&quot;;<br>       return 0;<br>   }<br>   <br>   # Does account already exist?<br>   my $user = EPrints::DataObj::User::user_with_username( $session, $username );<br>   if( !defined $user )<br>   {<br>       # New account<br>       $user = EPrints::DataObj::User::create( $session, &quot;user&quot; );<br>       $user-&gt;set_value( &quot;username&quot;, $username );<br>   }<br>   <br>   # Set metadata<br>   my $name = {};<br>   $name-&gt;{family} = $entr-&gt;get_value( &quot;sn&quot; );<br>   $name-&gt;{given} = $entr-&gt;get_value( &quot;givenName&quot; );<br>   $user-&gt;set_value( &quot;name&quot;, $name );<br>   $user-&gt;set_value( &quot;username&quot;, $username );<br>   $user-&gt;set_value( &quot;email&quot;, $entr-&gt;get_value( &quot;mail&quot; ) );<br>   $user-&gt;commit();<br>   <br>   $ldap-&gt;unbind if $ldap;<br>   <br>   return 1;<br>}<br><br><br><div class="gmail_extra"><div class="gmail_quote">On Thu, Dec 3, 2015 at 4:52 PM, Brian D. Gregg <span dir="ltr">&lt;<a href="mailto:bdgregg@pitt.edu" target="_blank">bdgregg@pitt.edu</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">





<div bgcolor="white" link="blue" vlink="purple" lang="EN-US">
<div>
<p class="MsoNormal"><span style="font-size:11pt;font-family:&quot;Calibri&quot;,sans-serif;color:rgb(31,73,125)">Our logic flow for LDAP and local logins is as follows and we had to pretty much write (re-write) our <a href="http://eprints_login.pl" target="_blank">eprints_login.pl</a> from scratch, but we had to do that for
 other reasons here as well due to the LDAP connection we needed to use to our central authentication system.  Our flow assumes that everyone logging in has a LDAP account first then tries the local DB if LDAP logon fails.<u></u><u></u></span></p>
<p class="MsoNormal"><img src="cid:image001.png@01D12DB8.B2C173F0" height="518" width="659"><span style="font-size:11pt;font-family:&quot;Calibri&quot;,sans-serif;color:rgb(31,73,125)"><u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:&quot;Calibri&quot;,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:&quot;Calibri&quot;,sans-serif;color:rgb(31,73,125)">Hope this helps.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:&quot;Calibri&quot;,sans-serif;color:rgb(31,73,125)">-Brian.<u></u><u></u></span></p>
<p class="MsoNormal"><span style="font-size:11pt;font-family:&quot;Calibri&quot;,sans-serif;color:rgb(31,73,125)"><u></u> <u></u></span></p>
<p class="MsoNormal"><a name="151688f02fd06c3f__MailEndCompose"><span style="font-size:11pt;font-family:&quot;Calibri&quot;,sans-serif;color:rgb(31,73,125)"> </span></a></p></div></div></blockquote></div></div></div>