忽略Spring Security中的用户名案例

时间:2012-06-07 04:21:17

标签: java spring-mvc spring-security

SpringSecurity是否具有忽略用户名字母大小写的内置功能?例如,如果用户名是" student001",那么它将接受" Student001"以及" stUdent001"。

我需要这个的原因是我们的系统使用电子邮件作为用户名。当然我可以通过扩展DAOAuthenticationProvider类来做到这一点,但我只是想知道这个问题是否存在任何内置选项?

3 个答案:

答案 0 :(得分:6)

如果您正在使用DaoAuthenticationProvider,那么我认为您正在使用JdbcDaoImpl,它会从JDBC数据库加载用户。

如果是这样,您可以通过自己手动创建bean来覆盖JdbcDaoImpl用于查找用户的SQL查询。 Spring Security使用的默认查询是:

select username,password,enabled from users where username = ?

您可以使用SQL lower函数忽略大小写:

select username,password,enabled from users where lower(username) = lower(?)

适当的Spring Security XML配置是:

<bean id="org.springframework.security.authenticationManager" class="org.springframework.security.authentication.ProviderManager">
    <property name="providers">
        <list>
            <ref bean="daoAuthenticationProvider"/>
        </list>
    </property>
</bean>

<bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider">
    <property name="userDetailsService" ref="caseInsensitiveUserDetailsService"/>
</bean>

<bean id="caseInsensitiveUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="usersByUsernameQuery" value="select username, password, enabled from users where lower(username) = lower(?)" />
</bean>

答案 1 :(得分:3)

我相信任何身份验证提供程序都会利用UserDetails和UserDetailsS​​ervice接口。

执行

UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

是针对特定于自定义应用的UserDetailsService,我们可以忽略username的情况并向spring-security提供UserDetails以继续进行进一步的身份验证/授权。

但是,如果提供的弹簧org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl被用作 UserDetailsService它会从条件为user的{​​{1}}表中加载用户详细信息。所以它区分大小写。

答案 2 :(得分:1)

gutch部分正确。它允许用户使用JdbcDaoImpl对用户表进行不区分大小写的检查。但是您还需要更改权限表查询。

<bean id="caseInsensitiveUserDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <property name="usersByUsernameQuery" value="select username, password, enabled from users where lower(username) = lower(?)" />
    <property name="authoritiesByUsernameQuery" value="select username,authority " +
        "from authorities where lower(username) = lower(?)" />
</bean>