针对LDAP的Apache Shiro身份验证 - 任何用户名/密码组合都可以通过

时间:2014-11-20 18:25:07

标签: spring authentication ldap shiro

我使用Spring,Vaadin和Apache Shiro开发Web应用程序进行身份验证和授权。我有两个领域,因为一些用户通过数据库登录,其他用户通过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
}

我几乎无处可读。 这篇文章(Shiro Authenticates Non-existent User in LDAP)对我没有帮助 - DN模板和URL都是正确的,服务器(LDAP服务器)正在运行。为什么它让所有人都通过?

如果我关闭Ldap领域,JDBC身份验证将完美运行。但是在他们两个都开启的情况下,每个人都会通过我使用FirstSuccessfulStrategy。

编辑:附加说明:如果我提供空密码,则会引发AuthenticationException。但任何非空密码都可以正常工作。

有什么想法吗?

0 个答案:

没有答案