如何在Java类中使用Spring的“user-by-username-query”子句?

时间:2011-08-04 17:51:21

标签: spring-security

我正在使用Spring安全性来验证用户登录。
用户凭证存储在数据库中。
以下是我的“ appContext-security.xml ”文件中的相关部分。

此代码有效 - 但我的问题是我正在使用原始SQL查询进行“ user-by-username-query ”和“ authority-by-username-query '标记。 因此,如果我必须支持多个数据库,并且如果Sql语法不同,那么我有一个问题。

那么我可以将这些查询放在某种形式的Java类中吗?这样我就可以轻松地更改该java类中的SQL语法并使这些SQL 依赖于DB

<authentication-manager alias="authManager">
        <authentication-provider>
            <password-encoder hash="md5"/>
            <jdbc-user-service data-source-ref="jndiDataSource"
                users-by-username-query="select name, password, enabled from USER where user_status&lt;&gt;0 and name=?"
                authorities-by-username-query="select m.name,p.name from USER m, ROLE p where m.name=? and m.application_role=p.id"/>
        </authentication-provider>
    </authentication-manager>

    <beans:bean id="jndiDataSource" class="org.springframework.jndi.JndiObjectFactoryBean">
        <beans:property name="jndiName" value="java:/appManaged"/>
    </beans:bean>

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:6)

您可以手动将JdbcDaoImpl声明为bean,而不是使用<jdbc-user-service>

<authentication-manager alias="authManager">
    <authentication-provider user-service-ref = "jdbcUserService">
        <password-encoder hash="md5"/>
    </authentication-provider>
</authentication-manager>

<beans:bean id = "jdbcUserService" 
    class = "org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl">
    <beans:property name = "dataSource" ref = "jndiDataSource" />
    <beans:property name = "usersByUsernameQuery" 
         value = "select name, password, enabled from USER where user_status&lt;&gt;0 and name=?"
" />
    ...
</beans:bean>

然后你可以做任何你想做的事情,例如,声明它是从设置适当查询的工厂获得的,或类似的东西。