Comment authentifier un utilisateur avec AD en Java


J'utilise la bibliothèque JNDI pour accéder à une annonce à partir de Java Webapp. J'authentifie agaisnt l'ANNONCE via LDAP en utilisant un utilisateur technique comme suit:

    Hashtable<String, String> ldapEnv = new Hashtable<String, String>(11);
    ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY, INITIAL_CONTEXT);
    ldapEnv.put(Context.PROVIDER_URL, providerUrl);
    ldapEnv.put(Context.SECURITY_AUTHENTICATION,
            SECURITY_AUTHENTICATION_SIMPLE);
    ldapEnv.put(Context.SECURITY_PRINCIPAL, principal);
    ldapEnv.put(Context.SECURITY_CREDENTIALS, credentials);
    return new InitialDirContext(ldapEnv);

J'utilise cet utilisateur pour lire et écrire de/vers AD.

Mais après cela, je ne sais pas comment authentifier l'utilisateur final qui accède vraiment à ma webapp avec son utilisateur et un mot de passe.

J'ai lu sur l'utilisation de la méthode find de la classe Context mais je ne sais pas comment faire ou comment construire le filtre de recherche. Pour exemple

(&(cn= ....

Je ne sais pas non plus comment trouver pour tous les utilisateurs dans l'ANNONCE. Je voudrais afficher dans ma webapp une liste de tous les utilisateurs disponibles dans AD

Author: Rafa Romero, 2015-03-05

5 answers

-Pour Authentifier un utilisateur

Hashtable<String, String> env = new Hashtable<String, String>();
env.put(Context.INITIAL_CONTEXT_FACTORY, "com.sun.jndi.ldap.LdapCtxFactory");
env.put(Context.PROVIDER_URL, "LDAP://url/");

env.put(Context.SECURITY_AUTHENTICATION, "simple");
env.put(Context.SECURITY_PRINCIPAL, "domain\\user_name");
env.put(Context.SECURITY_CREDENTIALS, "password");

InitialLdapContext ctx = new InitialLdapContext(env,null);
boolean authenticated = (ctx != null) ? true : false;

- Pour obtenir tous les noms des utilisateurs

public ArrayList<String> getAllUsers(LdapContext ctx) {
    ArrayList<String> users = new ArrayList<>();
    try {
        SearchControls constraints = new SearchControls();
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

        String[] attrIDs = {"cn"};
        constraints.setReturningAttributes(attrIDs);

        NamingEnumeration answer = ctx.search("dc=example,dc=com", "(&(cn=*))", constraints);

        while (answer.hasMore()) {
            Attributes attrs = ((SearchResult) answer.next()).getAttributes();
            users.add(attrs.get("cn").toString().replace("cn:", ""));
        }

    } catch (Exception ex) {
    }
    return users;
}

- Pour rechercher un usage particulier

public String getUserName(String username, LdapContext ctx) {
    try {
        SearchControls constraints = new SearchControls();
        constraints.setSearchScope(SearchControls.SUBTREE_SCOPE);

        String[] attrIDs = {"cn"};
        constraints.setReturningAttributes(attrIDs);

        NamingEnumeration answer = ctx.search("OU=Employees,OU=Users,DC=domain,DC=ifsworld,DC=com", "uid=" + username, constraints);

        if (answer.hasMore()) {
            Attributes attrs = ((SearchResult) answer.next()).getAttributes();
            return attrs.get("cn").toString().replace("cn:", "");
        } else {
            return null;
        }

    } catch (Exception ex) {
    }
    return null;
}

Vous pouvez obtenir plus de détails sur la requête de recherche à partir de ce

 2
Author: Sanira, 2017-05-23 12:06:36

Je crois que ce lien va sauver votre day:
http://www.javaxt.com/Tutorials/Windows/How_to_Authenticate_Users_with_Active_Directory Vous pouvez authentifier un utilisateur et lister les utilisateurs d'un domaine.

 2
Author: elsadek, 2015-03-12 06:31:19

-Pour vous authentifier , vous devez créer un contexte dir, comme vous l'avez mentionné dans votre question, pour chaque utilisateur essayant de se connecter.

Or Ou si vous avez Weblogic comme serveur d'applications , vous pouvez utiliser l'authentification du conteneur WL pour gérer la connexion utilisateur en configurant AD en tant qu'authenticatoe dans WL et en protégeant votre URL de connexion. : En savoir plus Configuration de la sécurité gérée par conteneur dans Weblogic

- Pour répertorier tous les utilisateurs sous une DSE racine ou une certaine Base DN

  1. Créer un contexte Dir pour pointer vers le DSE racine ou un DN en dessous

    DirContext ctx = InitialDirContext(ldapEnv);

  2. Faire le contexte.search() en passant les attributs de retour, les contrôles de recherche et le filtre de recherche correspondant aux classes d'objets utilisateur et à l'attribut de connexion

    SearchControls contrôles = new SearchControls(); contrôle.setReturningAttributes(nouvelle chaîne [] {"cn", " objectGUID"}); contrôle.setSearchScope(SearchControls.SUBTRE_SCOPE); Chaîne filter = "(&(cn=*)(|(objectclass=personne) (objectclass=organizationalPerson)))";

    NamingEnumeration searchResult = ctx.recherche("", filtre, contrôles);

- Pour rechercher un utilisateur particulier , modifiez le filtre pour qu'il corresponde à l'utilisateur cn ou à tout autre attribut

String filter = "(&(cn=Rafa Romero)(|(objectclass=person)(objectclass=organizationalPerson)))";
 2
Author: Roshith, 2017-05-23 12:06:36

Pourquoi n'utilisez-vous pas la même pour chaque utilisateur à s'authentifier.

Voir http://docs.oracle.com/javase/jndi/tutorial/ldap/security/ldap.html

Si vous obtenez le contexte pour cet utilisateur, cela signifie que le nom d'utilisateur et le mot de passe sont corrects. Sinon, vous n'obtenez pas l'exception et ne l'envoyez pas à l'écran de connexion de l'utilisateur, etc.

N'oubliez pas de fermer le contexte dans finally block s'il est authentifié.

 2
Author: Gokhan Oner, 2015-03-16 21:05:16

La plupart des conteneurs de servlet peuvent être configurés pour s'authentifier via LDAP, ce qui serait beaucoup plus sûr et fiable que de lancer votre propre code d'authentification.

Par exemple

 2
Author: Alex Fitzpatrick, 2017-05-23 12:06:36