Аутентификация Apache Shiro против LDAP — любая комбинация имени пользователя и пароля проходит

Я разрабатываю веб-приложение, используя Spring, Vaadin и Apache Shiro для аутентификации и авторизации. У меня есть две области, так как некоторые пользователи входят в систему через базу данных, а другие аутентифицируются по LDAP. Область JDBC работает отлично, но область LDAP каким-то образом пропускает всех - независимо от того, какая комбинация имени пользователя и пароля предоставлена.

Вот моя конфигурация Spring:

<!-- Apache Shiro -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
    <property name="securityManager" ref="securityManager" />
</bean>

<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
    <property name="realms">
        <list>
            <ref bean="jdbcRealm" />
            <ref bean="ldapRealm" />
        </list>
    </property>
    <property name="authenticator.authenticationStrategy">
        <bean class="org.apache.shiro.authc.pam.FirstSuccessfulStrategy" />
    </property>
</bean>
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

<bean id="ldapContextFactory" class="org.apache.shiro.realm.ldap.JndiLdapContextFactory">
    <property name="url" value="ldap://localhost:389" />        
</bean>

<bean id="jdbcRealm" class="org.apache.shiro.realm.jdbc.JdbcRealm">
    <property name="dataSource" ref="dataSource"></property>
</bean>
<bean id="ldapRealm" class="org.apache.shiro.realm.ldap.JndiLdapRealm">
    <property name="contextFactory" ref="ldapContextFactory" />
    <property name="userDnTemplate" value="uid={0},ou=people,dc=maxcrc,dc=com" />
</bean>

Вход в систему довольно типичен:

try {

    // Obtain user reference
    Subject currentUser = SecurityUtils.getSubject();   

    // Create token using provided username and password
    UsernamePasswordToken token = new UsernamePasswordToken(userName, password);

    // Remember user
    if(rememberMe.getValue())
        token.setRememberMe(true);

    // Login
    currentUser.login(token);

    // If we are here, no exception was raised and the user was logged in, so redirect
    UI.getCurrent().getNavigator().navigateTo("main" + "/" + "main-page");

    // Fire CustomEvent
    fireEvent(new CustomEvent(ErasmusLoginForm.this));

} catch ( UnknownAccountException e ) {
    Notification.show("No such user...");
} catch ( IncorrectCredentialsException e ) {
    Notification.show("Invalid creditentials...");
} catch ( LockedAccountException e ) {
    Notification.show("Locked account...");
} catch ( AuthenticationException e ) {
    e.printStackTrace();
    Notification.show("Some other exception...");
} catch (Exception e) {
    // Password encryption exception
}

Я читал почти везде без везения. Этот пост (Широ аутентифицирует несуществующего пользователя в LDAP) также был мне это не помогло - и шаблон DN, и URL-адрес верны, и сервер (сервер LDAP) работает. Почему он всех пропускает?

Если я отключу область Ldap, аутентификация JDBC будет работать отлично. Но когда они оба включены, все проходят, так как я использую FirstSuccessfulStrategy.

РЕДАКТИРОВАТЬ: Дополнительное примечание: если я укажу пустой пароль, возникает исключение AuthenticationException. Но любой непустой пароль работает нормально.

Любые идеи?


person tomomomo    schedule 20.11.2014    source источник
comment
Не могли бы вы предоставить журнал отладки для org.apache.shiro или, если он слишком велик, только для org.apache.shiro.realm.ldap.JndiLdapRealm?   -  person Zoran Regvart    schedule 26.11.2014