44 votes

LDAP à travers Ruby ou Rails

J'ai été de tenter de brancher une application Rails jusqu'à ActiveDirectory. Je vais être la synchronisation des données sur les utilisateurs entre AD et une base de données, actuellement MySQL (mais peut se transformer en SQL Server ou PostgreSQL).

J'ai vérifié activedirectory-ruby, et il a l'air vraiment buggy (pour une version 1.0!?). Il s'enroule Net::LDAP, j'ai donc essayé d'utiliser ce lieu, mais il est vraiment proche de la réelle syntaxe LDAP, et j'ai apprécié l'abstraction de l'ActiveDirectory-Ruby en raison de son ActiveRecord-syntaxe.

Est-il un élégant ORM-type d'outil pour un serveur d'annuaire? Mieux encore, s'il y avait une sorte d'échafaudage outil pour LDAP (CRUD pour les utilisateurs, les groupes, les unités de l'organisation, et ainsi de suite). Ensuite, j'ai pu rapidement intégrer à mon code d'authentification si Authlogic, et de garder toutes les données synchronisées.

39voto

Phrogz Points 112337

Voici un exemple de code que j'utilise avec le net-ldap gem pour vérifier les connexions des utilisateurs à partir d'active directory. serveur à mon travail:

require 'net/ldap' # gem install net-ldap

def name_for_login( email, password )
  email = email[/\A\w+/].downcase  # Throw out the domain, if it was there
  email << "@mycompany.com"        # I only check people in my company
  ldap = Net::LDAP.new(
    host: 'ldap.mycompany.com',    # Thankfully this is a standard name
    auth: { method: :simple, email: email, password:password }
  )
  if ldap.bind
    # Yay, the login credentials were valid!
    # Get the user's full name and return it
    ldap.search(
      base:         "OU=Users,OU=Accounts,DC=mycompany,DC=com",
      filter:       Net::LDAP::Filter.eq( "mail", email ),
      attributes:   %w[ displayName ],
      return_result:true
    ).first.displayName.first
  end
end

L' first.displayName.first code à la fin ressemble un peu maladroit, et pourrait bénéficier de quelques explications:

  • Net::LDAP#search toujours retourne un tableau de résultats, même si vous finissez par correspondance une seule entrée. Le premier appel à first trouve la première (et sans doute uniquement) entrée correspondant à l'adresse e-mail.

  • L' Net::LDAP::Entry renvoyés par la recherche idéalement vous permet d'accéder à des attributs via le nom de la méthode, de sorte some_entry.displayName est le même que some_entry['displayName'].

  • Chaque attribut dans une Net::LDAP::Entry est toujours un tableau de valeurs, même lorsqu'une seule valeur est présente. Bien qu'il puisse être ridicule d'avoir un utilisateur avec plusieurs "displayName" valeurs", LDAP générique de la nature signifie qu'il est possible. La finale first invocation transforme le tableau-de-une-chaîne dans la chaîne de caractères pour le nom complet de l'utilisateur.

8voto

4voto

Lolindrath Points 1779

C'est plus anecdotique qu'une vraie réponse...

J'ai eu une expérience similaire à l'aide de la Samba et le serveur OpenLDAP. Je ne pouvais pas trouver une bibliothèque pour faire vraiment ce que je voulais donc j'ai roulé ma propre helper classes.

J'ai utilisé ldapbrowser pour voir ce que les champs de Samba rempli en quand j'ai créé un utilisateur "officiel" de la manière et et essentiellement en double que.

La difficile seulement/non-standard LDAP, c'est la folle cryptage de mot de passe, nous avons:

userPass:

"{MD5}" + Base64.encode64(Digest::MD5.digest(pass))

sambaNTPassword:

OpenSSL::Digest::MD4.hexdigest(Iconv.iconv("UCS-2", "UTF-8", pass).join).upcase

Pour l' def authenticate(user, pass) fonction que j'ai essayer d'obtenir LDAP bind dans le domaine à l'aide de leurs informations d'identification, si je prends une exception alors la connexion a échoué, sinon de les laisser dans.

2voto

Judy Points 564

J'ai commencé à utiliser ruby-activedirectory et je l'ai même étendu / réparé, en hébergeant judy-activedirectory dans Github.

En effectuant la prochaine itération, j'ai découvert qu'ActiveLdap avait une base de code bien meilleure et j'envisage sérieusement de passer à celle-ci. Quelqu'un at-il une expérience personnelle avec cela?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X