我正在使用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<>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>
非常感谢任何帮助。
答案 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<>0 and name=?"
" />
...
</beans:bean>
然后你可以做任何你想做的事情,例如,声明它是从设置适当查询的工厂获得的,或类似的东西。