m-namikiの日記

おもしろき こともなき世を おもしろく

Spring Security

Spring SecuritySpring Sourceがリリースするユーザ認証とアクセス制御を行うためのプロダクトです。
ここ1年くらい携わってたいくつかのプロジェクトで利用してみましたが、ユーザ認証やURL直打ち対策なんかの、非機能要件だけど実装するのが案外面倒な事柄、に簡単に対応できるのが良い感じです。

参考サイトは↓
今必要な人のための速習 Spring Framework - 第11回 Spring Securityでラクラク! セキュリティ対策:ITpro
今必要な人のための速習 Spring Framework - 第12回 業務アプリでSpring Securityを使いこなせ!:ITpro
【ハウツー】概説 Springプロダクト(3) - Spring Securityでユーザ認証/アクセス制御 (1) Spring Securityとは | 開発・SE | マイナビニュース
blog: Spring SecurityでDB接続してユーザ認証してみる

以降はメモ

Spring Securityで対応できないこと
  • 不正なデータ入力
    • 入力チェック
  • SQLインジェクション
    • PreparedStatementを使う
  • XSS
  • 盗聴
    • SSLなど。SSL利用のサポート機能は提供しているらしい
  • 二重更新
    • 自分で対策を実装
  • なりすまし
    • こればっかりは
web.xmlに追加
<filter>
    <filter-name>springSecurityFilterChain</filter-name>
    <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
    <filter-name>springSecurityFilterChain</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>
Spring Securityのbean定義ファイル
<?xml version="1.0" encoding="UTF-8"?>
<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.0.xsd 
  http://www.springframework.org/schema/security 
  http://www.springframework.org/schema/security/spring-security-3.0.xsd">

    <!-- HTTP-Securityの定義 -->
    <http auto-config="true" disable-url-rewriting="true">
        <intercept-url pattern="/css/**" filters="none" />
        <intercept-url pattern="/img/**" filters="none" />
        <intercept-url pattern="/js/**" filters="none" />
        <intercept-url pattern="/login.jsp*" filters="none" />
        <form-login login-page="/login.jsp" default-target-url="/login.do"
            always-use-default-target="true" authentication-failure-url="/login.jsp?errorId=1" />
        <intercept-url pattern="/manager/**" access="ROLE_ADMIN" />
        <intercept-url pattern="/user/**" access="ROLE_ADMIN,ROLE_USER" />
        <intercept-url pattern="/**" access="ROLE_ADMIN,ROLE_USER,ROLE_GUEST" />
        <logout logout-url="/logout" logout-success-url="/login.jsp"
            invalidate-session="true" />
        <anonymous granted-authority="ROLE_ANONYMOUS" />
    </http>

    <!-- ユーザ認証の定義 -->
    <authentication-manager>
        <authentication-provider user-service-ref="myUserDetailsService">
            <password-encoder hash="md5" />
        </authentication-provider>
    </authentication-manager>

    <!-- JdbcDaoImplを拡張したUserDetailsServiceの実装クラスの定義 -->
    <beans:bean id="myUserDetailsService"
        class="net.sasuke.security.MyAdminDetailService">
        <beans:property name="dataSource" ref="dataSource" />
        <beans:property name="usersByUsernameQuery"
            value="SELECT login_id, password, role_id, user_name FROM m_user WHERE login_id = ?" />
        <beans:property name="authoritiesByUsernameQuery"
            value="SELECT login_id, case role_id when 1 then 'ROLE_ADMIN' when 2 then 'ROLE_USER' when 3 then 'ROLE_GUEST' END FROM m_user WHERE login_id = ?" />
    </beans:bean>
</beans:beans>
  • http要素
    • auto-config : 自動設定の有効化
  • intercept-url要素
    • pattern : 認証チェックを行うURLを定義
    • filter : noneの場合は認証チェックなし
    • access : アクセス可能なロール名
  • form-login要素
    • login-page : ログイン画面のURL
    • default-target-url : ユーザ認証OK時の遷移先URL
    • authentication-failure-url : ユーザ認証NG時の遷移先URL
  • logout要素
    • logout-url : ログアウトのURL
    • logout-success-url : ログアウト後の遷移先URL
  • password-encoder要素
    • パスワードをハッシュ化している場合の方式
    • md5以外には、plaintext, sha, sha-256, md4 がある