Spring Security 3でDB認証してみる
Spring Security 3.0.7 を使ってます。DBで認証を行いたくて、いろいろ試してみました。----------------------------------<authentication-manager> <!-- DB認証 --> <authentication-provider> <password-encoder hash="sha-256" > <salt-source user-property="username" /> </password-encoder> <!-- データソース指定。SQL指定。 --> <jdbc-user-service data-source-ref="dataSourceCs" users-by-username-query="select user_id as username, password, enabled from Users where user_id = ?" authorities-by-username-query="select user_id as username, authority from Authorities where user_id = ?"/> </authentication-provider></authentication-manager>-------------------------------------------テーブルに関しては2種類+---------------+---------------+| Field | Type |+---------------+---------------+| user_id | varchar(32) || password |varchar(255) || enabled | tinyint(1) || user_name | varchar(64) || mailaddress | varchar(255) || memo | text || auth_type | varchar(8) || ins_datetime | datetime || ins_user | varchar(32) || upd_datetime | datetime || upd_user | varchar(32) |+---------------+---------------++---------------+---------------+| Field | Type |+---------------+---------------+| user_id | varchar(32) || authority | varchar(128) || ins_datetime | datetime || ins_user | varchar(32) || upd_datetime | datetime || upd_user | varchar(32) |+---------------+---------------+※いろいろやってみた<salt-source user-property="username" /> は<salt-source user-property="getUsername" />でもOKパスワードエンコーダの設定は、<password-encoder hash="sha-256"/>と<password-encoder ref="passwordEncoder" /><beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"> <beans:constructor-arg value="256" /></beans:bean>で、同じことを記述していることになるので、どちらでもOKSHA-256でエンコード。Saltに、username を使う場合、DBへの登録は、PasswordEncoder shaPasswordEncoder = new ShaPasswordEncoder(256);user_id :admin"password :shaPasswordEncoder.encodePassword("admin", "admin")となる。saltを指定しない場合は、password :shaPasswordEncoder.encodePassword("admin", null)ちなみに、文字列:adminを、SHA-256でエンコードした場合、saltなし:8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918salt(username):a4a88c0872bf652bb9ed803ece5fd6e82354838a9bf59ab4babb1dab322154e1となる。------------------------------------------------------------------------------ためしに、daoAuthenticationProviderをauthentication-providerの refに指定してやってみたが、password-encodeとsaltが効かなかった。Spring Security 3.0.7 を使っているからかもしれないけど、admin:adminではログインができずadmin:a4a88c0872bf652bb9ed803ece5fd6e82354838a9bf59ab4babb1dab322154e1 だとログインができた。・・・・・ これどうすりゃいいんだ?※というかこれ(ref=daoAuthenticationProvider の記述)でずっとはまってましたorz------------------ <!-- 認証設定 --> <authentication-manager> <!-- DB認証 --> <authentication-provider ref="daoAuthenticationProvider"> <password-encoder ref="passwordEncoder"> <salt-source ref="saltSource"/> </password-encoder> </authentication-provider></authentication-manager> <!-- DAO Authentication --> <beans:bean id="daoAuthenticationProvider" class="org.springframework.security.authentication.dao.DaoAuthenticationProvider"> <beans:property name="userDetailsService" ref="userDetailsService"/> </beans:bean> <beans:bean id="userDetailsService" class="org.springframework.security.core.userdetails.jdbc.JdbcDaoImpl"> <beans:property name="dataSource" ref="dataSourceCs"/> <beans:property name="usersByUsernameQuery" value="select user_id as username, password, enabled from Users where user_id = ?"/> <beans:property name="authoritiesByUsernameQuery" value="select user_id as username, authority from Authorities where user_id = ?"/> </beans:bean> <beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"> <beans:constructor-arg value="256" /> </beans:bean> <beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource"> <beans:property name="userPropertyToUse" value="username" /> </beans:bean>-------------------------------------------------------------------------結局、設定は、 <!-- 認証設定 --> <authentication-manager> <!-- DB認証 --> <authentication-provider> <password-encoder ref="passwordEncoder"> <salt-source ref="saltSource"/> </password-encoder> <!-- データソース指定。SQL指定。--> <jdbc-user-service data-source-ref="dataSourceCs" users-by-username-query="select user_id as username, password, enabled from Users where user_id = ?" authorities-by-username-query="select user_id as username, authority from Authorities where user_id = ?"/> </authentication-provider> </authentication-manager> <beans:bean id="passwordEncoder" class="org.springframework.security.authentication.encoding.ShaPasswordEncoder"> <beans:constructor-arg value="256" /> </beans:bean> <beans:bean id="saltSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource"> <beans:property name="userPropertyToUse" value="username" /> </beans:bean>という形で収まった