Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > JSF+Active directory


Автор: Vofka 6.9.2007, 13:31
Как сделать чтобы аутентификация пользователя jsf приложения происходила с помощью active directory?

Автор: batigoal 6.9.2007, 13:40
Не особо разбираюсь в сабже, но ведь к AD можно обратиться через LDAP, работа с которым в Java  поддерживается.

Автор: Vofka 6.9.2007, 14:50
А пример какой нибудь простенький можно?или сылочку где почитать можно?

Автор: batigoal 6.9.2007, 15:45
Личным примером не помогу. Посмотри статьи с гугла: http://www.google.com/search?hl=en&q=java+ldap+active+directory&meta=

Автор: vzf 7.9.2007, 17:35
Если используется Tomcat, то там можно настроить соответствующий Realm, который будет использовать указанный LDAP сервер для аутентификации пользователей и разграничения доступа. В доках томката об этом написано (если не ошибаюсь в разделе про realms)

Добавлено через 5 минут и 30 секунд
А так если реализовывать security своими руками то, тогда нужна соединяться с AD как уже сказал batigoal. Смысл простой. В LDAPContext кладешь имя и пароль пользователя, указываешь способ аутентификации (simple, md5 и пр.) и соединяешься с LDAP. Если выбрасывается эксепшн (что то типа AuthenticationException , в доках посмотришь) то значит данные пользователя были указаны неверно.

Добавлено через 5 минут и 53 секунды
Если надо могу дать исходник , только не раньше понедельника. 

Автор: Vofka 10.9.2007, 15:47
Использоваться будет Oracle Aplication Server.От исходников не откажусь. 

Автор: vzf 11.9.2007, 10:09
Вот так я проверял зарегистрирован ли пользователь в LDAP или нет. Закомментированный блок почему то не работает с AD. Он узнаёт какие способы аутентификации поддерживает сервер LDAP. Но и без него можно обойтись.

Код

public class CActiveDirectoryService
{
    /**
     * AD server host.
     */
    private String host;

    /**
     * AD server domain.
     */
    private String domain;

    /**
     * AD server port.
     */
    private String port;

    /**
     * Prefix for user name.
     */
    private String userNamePrefix;

    /**
     * base for user name
     */
    private String base;

    /**
     * digest method name for the authentication
     */
    private String authDigetsMethod;

    /**
     * defines support LDAP server digest authentication or not 
     */
    private boolean digestMethodSupport;

    /**
     * Logger for this class 
     */
    private static final Logger logger =
            Logger.getLogger(CActiveDirectoryService.class);

    /**
     * Creates new instance.
     */
    public CActiveDirectoryService()
    {

        host = CResourceBundleUtil.getLdapBundleString("ldap.host", null);
        domain = CResourceBundleUtil.getLdapBundleString("ldap.domain", null);
        port = CResourceBundleUtil.getLdapBundleString("ldap.port", null);
        base = CResourceBundleUtil.getLdapBundleString("ldap.base", null);
        userNamePrefix =
                CResourceBundleUtil.getLdapBundleString("ldap.userNamePrefix", null);
        authDigetsMethod =
                CResourceBundleUtil
                        .getLdapBundleString("ldap.auth.digest.method", null);
        digestMethodSupport = false;
    }

    /**
     * Returns true if user with provided credentials is registered 
     * in Active Directory.
     * 
     * @param userName login of the user to check.
     * @param password password of the user.
     * @return true if user with provided credentials is registered 
     * in Active Directory
     * @throws NamingException if smth wrong
     */
    public boolean isUserRegisteredInActiveDirectory(String userName,
            String password) throws NamingException
    {

        String urlDC = "ldap://" + host + "." + domain + ":" + port + "/";
        Hashtable ldapEnv = new Hashtable();
        
        /*
        // getting supported SASL Mechanism for the authentication
        LdapContext ctx = new InitialLdapContext();
        Enumeration enumeration = ctx.getAttributes(urlDC, new String[]
        { "supportedSASLMechanisms" }).getAll();

        while (enumeration.hasMoreElements())
        {
            Attribute attr = (Attribute) enumeration.nextElement();

            if (attr.contains(authDigetsMethod))
            {
                digestMethodSupport = true;
            }
        }

        if (digestMethodSupport)
        {
            ldapEnv.put(Context.SECURITY_AUTHENTICATION, authDigetsMethod);
            ldapEnv.put(Context.SECURITY_PRINCIPAL, userName);
            logger.debug("Authentication method: " + authDigetsMethod);
        }
        else
        {
            ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
            ldapEnv.put(Context.SECURITY_PRINCIPAL, userNamePrefix + userName + ","
                    + base);
            logger.debug("Authentication method: simple");
        }
        */
        
        logger.debug("Authentication method: simple");
        ldapEnv.put(Context.SECURITY_AUTHENTICATION, "simple");
        ldapEnv.put(Context.SECURITY_PRINCIPAL, userNamePrefix + userName); 
        ldapEnv.put(Context.SECURITY_CREDENTIALS, password);
        ldapEnv.put(Context.PROVIDER_URL, urlDC);
        ldapEnv.put(Context.INITIAL_CONTEXT_FACTORY,
                "com.sun.jndi.ldap.LdapCtxFactory");
        
        try
        {
            LdapContext ctx = new InitialLdapContext(ldapEnv, null);
            return true;
        }
        catch (AuthenticationException e)
        {
            logger.error("Error accessing Active Directory:", e);
            return false;
        }
        catch (NamingException e)
        {
            logger.error("Error accessing Active Directory:", e);
            throw new NamingException("Error accessing Active Directory");
        }
        finally
        {
            if (ctx != null)
            {
                ctx.close();
            }
        }
    }
}

Автор: Vofka 11.9.2007, 17:51
Спасибо.буду пробовать. 

Автор: jsa 12.9.2007, 04:50
Цитата(Vofka @ 10.9.2007,  20:47)
Использоваться будет Oracle Aplication Server.

Дык, в чем проблема, в OAS это все поддерживаться, SSO настраивай на Windows Native Authentification и будет тебе счастье

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)