DBのユーザ情報を使用して認証するには? | Java Springの逆引きメモ

Java Springの逆引きメモ

JavaのSpring frameworkのメモを書いていきます!
初心者の勉強ノートなので間違いがあるかもしれませんが、何かヒントになることがあれば幸いです。

前回 は、設定ファイル上にログインユーザのIDとPWを記述して認証する方法をみてみました!


今回はいよいよDBからログインID・PWを取得して認証します。

これも設定だけでできますニコニコ

では早速みてみましょう!


以下のsecurityApplication.xmlファイル以外は前回の設定と同じなので、前回の記事を参照してくださいませー。



【設定ファイル(securityApplication.xml)】

<?xml version="1.0" encoding="UTF-8"?>

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

  <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.postgresql.Driver"/>
    <property name="url">
      <value>jdbc:postgresql://localhost/test?useUnicode=true&amp;characterEncoding=utf-8</value>
    </property>
    <property name="username" value="user" />
    <property name="password" value="pass" />
 </bean>

 <!-- 認証と認可の設定です --> 
 <sec:http auto-config="true" access-denied-page="/403.jsp" >
  <!-- 認可のURL設定 -->
  <sec:intercept-url pattern="/secure/sys*" access="ROLE_ADMIN"/> 
  <sec:intercept-url pattern="/secure/usr*" access="ROLE_ADMIN,ROLE_USER"/>
  <sec:intercept-url pattern="/secure/**" access="IS_AUTHENTICATED_FULLY"/>
  <sec:intercept-url pattern="/**" access="IS_AUTHENTICATED_ANONYMOUSLY"/>
  <!-- 認証の設定 -->
  <sec:form-login login-page="/login.jsp" default-target-url="/top.jsp" authentication-failure-url="/error.jsp"/> 
  <sec:logout logout-url="/logout"  logout-success-url="/login.jsp" invalidate-session="true"/>
  <sec:anonymous granted-authority="ROLE_ANONYMOUS"/>
 </sec:http>
   
   
 <!-- 
  ログインユーザの情報の設定。SQL文を指定してDBから取得する方法もあります。 
 -->
 <sec:authentication-provider>
  <sec:jdbc-user-service data-source-ref="dataSource" 
  users-by-username-query="
    SELECT login_id, login_pw, 'true'
      FROM user
     WHERE login_id = ?"
     
  authorities-by-username-query="
    SELECT login_id, role 
      FROM user 
     WHERE login_id = ?" /> 
</sec:authentication-provider> 
 

</beans>




【説明】

前回の記事と違いを見てください。


<beanタグ>

まず、dataSourceのbeanがあります。

これはDBと接続するためです。

ここではサンプルを単純にするため、securityApplicationと同じファイルに記述しています。

実際の開発では、他でもdataSourceは使用するので他のファイルに記述しましょう!

<httpタグ>
次に、httpタグですが、これは前回の記事と同じです。


authentication-providerタグ>

最後に、本命登場!

authentication-providerの中身のタグが前回と違ってますね!

属性にSQLが記述されていますが、それぞれ、パスワードの認証のためのSQLと

権限のロールを取得するためのSQLです。


それぞれプレースホルダを持っています。

そこには、ログインIDが置換されます。


select文の抽出の順番は決まっているので注意です。

パスワードの認証のためのSQLは、「ユーザID」、「パスワード」、「ユーザの有効性」。

「ユーザの有効性」はログインアカウントを論理削除している場合に使用します。

ここでは論理削除のフィールドがないものとして'true'に設定しています。

ここの値は、"0"か"1"、もしくは、"true"か"false"です。

もうひとつ、

認可のSQL文は、「ユーザID」、「権限」。


たったのこれだけです!

簡単だし、分かりやすいですよね?


ぜひぜひ使って楽をしましょう(^^)




参考:

・SpringSecurityの機能について

・実際に認証と認可をWEBにつけるには? (基本編:設定方法)

http://itpro.nikkeibp.co.jp/article/COLUMN/20090224/325394/?ST=develop&P=7