突然ですが、みなさんはプログラムを書く時にセキュリティ面を意識していますか?
今回紹介するのはセキュリティ面に特化したフレームワーク、SpringSecurityというものです。
SpringSecurityとは?
Springベースのアプリケーションに対してセキュリティ強化を実現するために2003年にベンアレックス氏らにより開発されました。
SpringSecurityでできること
基本機能
- 認証:ログインシステムのようなユーザーの正当性を確認することを指します
- 認可:会員限定のページなどに一般ユーザーがアクセスしないようアクセスの制限をかけることを指します
強化機能
- セッション管理:セッション固定攻撃やセッションハイジャックからユーザーを守ることができる
- CSRF対策:クロスサイトリクエストフォージェリ(CSRF)攻撃からユーザーを守ることができる
今回はこれだけしか取り上げませんが、SpringSecurityでは上記以外のセキュリティも強化することができます。
実装編
今回はDBを使った認証については紹介をせず、簡単な認証と認可システムを作っていきます。
開発環境
- MacOS Catalina 10.15.7
- SpringBoot 2.5.0
- SpringToolSuite4
- SpringSecurity 5.5.0
- Maven
SpringSecurityの実装
今回はMavenを使った実装方法を紹介します。
pom.xmlに以下のように依存関係を追加してください。
これでプロジェクトに対してセキュリティ機能を追加することができます。
HTMLの紹介
<login.html>
<success.html>
login.htmlではusernameとpasswordをログイン情報として送信しています。
success.htmlでは認証が成功した時に表示するページになります。
セキュリティ設定
では、実際にセキュリティの設定をしていきます。
解説
ここでは実際にセキュリティの設定をおこなっています。
その際に13行目の記述と、WebSecurityConfigurerAdapterを継承する必要があります。
WebSecurityConfigurerAdapterクラスのconfigureメソッドをオーバーライドし、実際に認証と認可の設定をしています。
configureメソッドはlogin.htmlからログイン情報が送信された時に実行されるメソッドです。
configureメソッドの中身についてみていくと、
20行目ではどのユーザーでもアクセス可能にするURLを指定しており、それ以外のURLに関しては認証しないとアクセスできません。
25行目では認証が成功した時に遷移するURLを指定しています。
反対に26行目では認証が失敗した時のURLを指定しています。
実際に認証を行ってるのが、34行目〜41行目の処理になります。
ここではログイン情報を元にインメモリー認証をおこなっています。
38〜40行目で認証情報の設定をしています。
40行目のwithUser()の値とpassword()の値を元に、入力された値とマッチするのかどうかをみています。
また、SpringSecurityでは認証をする際にパスワードをハッシュ化しなくてはいけないので、passwordを36行目でハッシュ化しています。
ハッシュ化をするために、必要なクラスを呼び出してるのが44~46行目になります。
BCryptPasswordEncoder()はSpringSecurityでサポートされてる機能の一つでパスワードのハッシュ化を行うことができます。
コントローラー
今回は、SpringSecurityにフォーカスした内容なのでコントーラークラスを作らず設定ファイルで処理のコントロールを行います。
そのコードが以下のようになります。
ViewControllerRegistryで処理の遷移を行なっていきます。
addViewController()ではURLマッピングを指定し、setViewName()では遷移先のhtmlファイルを設定しています。
実行
では、実際に実行をしてみましょう。
上記のアドレスにアクセスしてみると、自動的にlogin.htmlのページにとびます。
antMatchers()で指定したURL以外のURLを入力するとエラーになります。
ユーザーネームに「ken」、passwordに「password」を入力してみてください。
無事、認証に成功したと思います。
まとめ
SpringSecurityの実装については以上になります。
今回は、DB接続を使わずインメモリによる簡単な認証を行いました。
みなさんもWebアプリケーションを作成する際にはSpringSecurityの実装をしてみてはどうでしょうか?
長いこと読んでいただきありがとうございました。