Spring security 如何使用Spring';s";“按用户名查询用户”;Java类中的子句?

Spring security 如何使用Spring';s";“按用户名查询用户”;Java类中的子句?,spring-security,Spring Security,我正在使用SpringSecurity验证用户登录。 用户凭据存储在数据库中。 以下是我的“appContext security.xml”文件中的相关部分 这段代码可以工作-但我的问题是,我正在使用原始SQL查询作为“按用户名查询的用户”和“按用户名查询的权限”标记。 因此,如果我必须支持多个数据库,并且Sql语法不同,那么我就有问题了 那么,我可以将这些查询放在Java类的某种形式中吗?这样我就可以轻松地更改该Java类中的SQL语法,并使这些SQL依赖于数据库 <authentica

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

这段代码可以工作-但我的问题是,我正在使用原始SQL查询作为“按用户名查询的用户”和“按用户名查询的权限”标记。 因此,如果我必须支持多个数据库,并且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>


非常感谢您的帮助。

您可以手动将
JdbcDaoImpl
声明为bean,而不是使用

<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>


感谢您的快速响应。但我仍然可以看到SQL是XML定义的一部分。我应该如何提供自己的JdbcDaoImpl实现,以便可以通过UsernameQuery()和setUsersByUsernameQuery()覆盖其SetAuthoritiesapi?我知道了。我引入了我自己的DaoImpl类,它从org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl扩展而来,然后适当地覆盖了“public userdetails loadUserByUsername(String username)”api。现在我有了更多的控制权。谢谢你的帮助。非常感谢。这正是我想要的!谢谢。