2011-08-04 10 views
4

私は、春のセキュリティを使用してユーザーのログインを検証しています。
ユーザーの資格情報はデータベースに格納されます。
私の "appContext-security.xml"ファイルの関連セクションです。Springの "user-by-username-query"節をJavaクラスで使用する方法は?

このコードは動作します - しかし、私の問題は、私は「バイ・ユーザ名・クエリーユーザー」と "当局バイ名クエリ"タグの生のSQLクエリを使用していますということです。 したがって、複数のデータベースをサポートする必要があり、SQL構文が異なる場合、問題が発生します。

これらのクエリをJavaクラスの形式にすることはできますか?そのJavaクラスは簡単にこれらの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> 

ご協力いただければ幸いです。

答えて

6

あなたが代わりに<jdbc-user-service>を使用しての手動BeanとしてJdbcDaoImplを宣言することができます。

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

あなたがやりたいことができそして、例えば、それは適切なクエリを設定し、工場、または何かから得られることを宣言するそうですね。

+0

迅速な対応に感謝します。しかし、私はまだSQLがXML定義の一部であることがわかります。 setAuthoritiesByUsernameQuery()およびsetUsersByUsernameQuery()apisをオーバーライドできるように、JdbcDaoImplの独自の実装をどのように提供する必要がありますか? – javauser71

+0

私はそれを得た。私はorg.springframework.security.core.userdetails.jdbc.JdbcDaoImplから拡張した独自のDaoImplクラスを導入し、 "public UserDetails loadUserByUsername(String username)" apiを適切にオーバーライドしました。今私はより多くのコントロールを持っています。ご協力いただきありがとうございます。とても有難い。 – javauser71

+0

私が探していたもの!どうもありがとう。 – javabot

関連する問題