Как использовать предложение Spring «user-by-username-query» в классе Java? - PullRequest
4 голосов
/ 04 августа 2011

Я использую Spring security для проверки логина пользователя.Учетные данные пользователя хранятся в базе данных.Вот соответствующий раздел из моего файла " appContext-security.xml ".

Этот код работает, но моя проблема в том, что я использую необработанный запрос SQL Теги « запрос пользователя по имени пользователя » и « полномочия по запросу имени пользователя ». Таким образом, если мне придетсяподдержка нескольких баз данных, и если синтаксис Sql варьируется, у меня возникает проблема.

Итак, могу ли я поместить эти запросы в какую-либо форму класса Java? так, чтобы я мог легко изменить синтаксис SQL в этом классе Java исделать эти 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>

Любая помощь будет высоко ценится.

1 Ответ

6 голосов
/ 04 августа 2011

Вы можете объявить JdbcDaoImpl как компонент вручную вместо использования <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>

Тогда вы можете делать все, что захотите, например, объявить, что оно получено от фабрики, которая задает соответствующие запросы, или что-то в этом роде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...