spring security DBの暗号化パスワードで認証する方法

spring

spring securityでDB接続する方法はコチラで紹介しましたが、今回は暗号化されたパスワードで認証する方法を紹介していきます。

最近のシステムではパスワードをDBに持たせる時は大体暗号化していると思いますので、spring securityを使う時は今回紹介する方法を使う場面が多くなると思います。

[スポンサーリンク]

Spring SecurityでDB接続する方法

Spring SecurityでDB接続する方法はコチラのページを参考にしてください。
このページではこちらの設定を基に解説を進めていきます。
spring securityでDB接続して認証・認可する方法

DBへユーザ情報を登録

ユーザ情報は、ユーザ名・パスワード・権限を登録しておきます。
パスワードは、SHA-256で暗号化したものを登録します。

CREATE TABLE users (
  name VARCHAR(255),
  password VARCHAR(255),
  authority VARCHAR(255)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO users 
  (name, password, authority)
  values
  ('admin', '8c6976e5b5410415bde908bd4dee15dfb167a9c873fc4bb8a81f6f2ab448a918', 'ROLE_ADMIN');

Spring Securityの設定ファイル

<beans:beans xmlns="http://www.springframework.org/schema/security"
    xmlns:beans="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
    http://www.springframework.org/schema/security
    http://www.springframework.org/schema/security/spring-security-4.0.xsd">

    <http auto-config="true" >
        <!-- 認可の設定 --> 
        <intercept-url pattern="/top*" access="hasAnyRole('ROLE_ADMIN', 'ROLE_USER')" />
        <intercept-url pattern="/admin*" access="hasRole('ROLE_ADMIN')" />
        <intercept-url pattern="/user*" access="hasRole('ROLE_USER')" />
        
        <!-- 権限なし時の遷移先 -->
        <access-denied-handler error-page="/403" />
        
        <!-- 認証のログイン処理 -->
        <form-login 
            login-page="/" 
            default-target-url="/top" 
            authentication-failure-url="/error" 
            login-processing-url="/j_spring_security_check"/>
        
        <!-- 認証のログアウト処理 -->
        <logout
            logout-url="/logout"
            logout-success-url="/"
            invalidate-session="true"/>
        <!-- anonymousユーザのROLE -->
        <anonymous granted-authority="ROLE_ANONYMOUS" />
    </http>

	<beans:bean id="dataSource"
	    class="org.springframework.jdbc.datasource.DriverManagerDataSource" >
	    <beans:property name="driverClassName" value="org.gjt.mm.mysql.Driver" /> 
	    <beans:property name="url" value="jdbc:mysql://127.0.0.1:3306/test_db" /> 
	    <beans:property name="username" value="root" />
	    <beans:property name="password" value="root" />
	</beans:bean>

   <authentication-manager alias="authenticationManager">
     <authentication-provider>
      <!-- SQLでユーザ情報取得 -->
      <password-encoder hash="sha-256"/>
      <jdbc-user-service
        data-source-ref="dataSource"
        users-by-username-query="
            select 
                name as username, password as password, true as enabled 
            from 
                users 
            where 
                name=?"
        authorities-by-username-query="
            select 
                name as username, authority as authority 
            from 
                users 
            where 
                name=?"/>
     </authentication-provider>
   </authentication-manager>

</beans:beans>

springとjavaのバージョン

springframeworknのバージョンは、4.0.1を使っています。
javaは、version 8を使っています。

さいごに

暗号化されたパスワードで認証する場合もpassword-encoderを設定ファイルへ1行追加するだけなので設定も楽ですね!

それでは!