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

jav*_*r71 5 spring-security

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

此代码有效 - 但我的问题是我使用原始SQL查询 " user-by-username-query "和" authority-by-username-query "标签.因此,如果我必须支持多个数据库并且如果Sql语法各不相同,那我就有问题了.

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

<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>
Run Code Online (Sandbox Code Playgroud)

任何帮助都感激不尽.

axt*_*avt 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>
Run Code Online (Sandbox Code Playgroud)

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