Я разрабатываю веб-приложение, используя 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. Но любой непустой пароль работает нормально.
Любые идеи?
org.apache.shiro
или, если он слишком велик, только дляorg.apache.shiro.realm.ldap.JndiLdapRealm
? - person Zoran Regvart   schedule 26.11.2014