プログラミング Java

【SpringSecurity】#1~ ログイン画面の実装(認証)

投稿日:2021年2月7日 更新日:

概要

SpringSecurityを導入してユーザ認証機能を実現します。
まずはログイン認証機能が使えるようになることを目標にしていますので、
本記事で解説する構成は最小限にとどめています。
 

準備

SpringSecurityで認証機能を実装できるように、まずは環境を準備します。

構成管理

本記事では構成管理はMavenを使用しています。
Mavenではpom.xmlにSpringSecurityを追加することで利用可能になります。

ユーザテーブル

ユーザ情報を格納するテーブルを作成します。
ユーザID、名前、パスワード、ロールがあればよいです。
以下は慣例として、作成日時等の共通カラムも含めたDDLです。

 

パスワードは、「password」をBCryptPasswordEncoder()でエンコードした値を保持しています。
 

実装

SpringSecurityの設定

配置場所:/src/main/java/com/example/demo/SecurityConfig.java

アノテーション

  • @Configuration
  • 設定用クラスであることを示すアノテーション

  • @EnableWebSecurity
  • Spring Securityのウェブ用の機能を利用するためのアノテーション

http.authorizeRequests()

  • antMatchers(“/hoge/**”)
  • 一致するディレクトリの指定です。(上記例は、hogeディレクトリ配下全てを示す)

  • permitAll()
  • アクセスを許可します。

  • asAuthority(“ROLE_ADMIN”)
  • 指定した(ROLE_ADMIN)の権限を有するユーザのみアクセスを許可します。

  • anyRequest().authenticated()
  • 条件に一致しないすべてのURLへのアクセスは、ユーザ認証のみを要求します。

formLogin()

  • usernameParameter(“username”)、passwordParameter(“password”)
  • ログイン画面のname属性(“username”等)を、
    ログインユーザ名とログインパスワードとして取得する。

  • defaultSuccessUrl(“/”, true)
  • 第1引数はログイン成功時のデフォルトのアクセスURLです。
    第2引数はデフォルトアクセスURLへの遷移を強制するかの指定です。
     true :”/”に遷移
     false:認証前に遷移しようとした遷移先
     (“/hoge/page/1″に遷移しようとしてログイン認証を要求された場合、ログイン後は”/hoge/page/1″に遷移する)

  • failureUrl(“/login-error”)
  • ログイン認証に失敗した場合に遷移するURL。

System.out.println("password : " + passwordEncoder().encode("password"));
⇒インポートデータの「password」をエンコードするために仮実装したもの。
 

ログイン認証機能

Model
ユーザ情報テーブル(Customer)に対応するModelオブジェクトを用意します。

Repository
ユーザ情報テーブル(Customer)にアクセスするレポジトリーを用意します。

Mapper
Mapper用のXMLを用意します。
Repositoryと同じ階層となるように配置する必要があるので、以下のようにします。
また、名称も同じにする必要がありますので揃えておきます。
Repository:src/main/java/com/example/demo/domain/repository/CustomerRepository.java
XML   :src/main/resources/com/example/demo/domain/repository/CustomerRepository.xml

UserDetails
UserDetailsを継承したCustomerDetailsを実装します。
これはユーザ情報を保持するクラスであり、権限やアカウントの状態を扱います。

  • getAuthorities()
  • 権限をCollectionで返します。
    ユーザ情報テーブル(Customer)では、roleカラム内に,(カンマ)で区切って複数の権限を保持するようにしていますので、AuthorityUtils.createAuthorityListメソッドの引数に、カンマでsplitした結果の配列を返すこととしています。
    ※superユーザのroleカラムを参照

  • getPassword(), getUsername()
  • ユーザIDとパスワードを返すGetterです。

  • isAccountNonExpired(), isAccountNonLocked(), isCredentialsNonExpired(), isEnabled()
  • アカウントが有効であるかを検証する各種の設定です。
    特に実装はおこないませんが、ログインできるように全てtrueに設定します。

Service
UserDetailsServiceクラスを継承したCustomerServceクラスを実装します。
検索するユーザが存在すれば、UserDetailsを返します。
もしなければ、UsernameNotFoundExceptionがthrowされます。

 

ログイン画面


SpringSecurityで自動生成されるログインページです。
独自のログイン画面を実装することも可能なので、興味のある方は更に踏み込んでみて下さい。
(参考)
#3~ 独自のログイン画面
 

ログアウト

/logoutにリンクを用意するだけでログアウトは実現できます。
ログアウト画面を独自に実装したい場合は独自に実装する必要はあります。
 

まとめ

  • SpringSecurityの導入はMavenの構成管理(pom.xml)だと簡単に行える。
  • ユーザ用のテーブルを用意すること。
    また、権限カラム(role)で権限を設定可能になる。
  • SpringSecuriyの設定用クラスには、@Configurationと@EnableWebSecurityアノテーションを付ける。
  • デフォルトのログイン画面が用意されているので、カスタマイズしたい場合のみ作成する。
  • ログアウトはデフォルトの機能が用意されているので、カスタマイズしたい場合は実装を行う。

 
最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!
もし内容が良かったらランキング評価を頂けると励みになります(^^)

ランキング評価する

-プログラミング, Java
-,

執筆者:


comment

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


関連記事

no image

PHPの開発環境の作り方

前提 OS:Windows10 準備 XAMPPのダウンロード https://www.apachefriends.org/jp/download.html 構築 XAMPPのインストール インストー …

Jacksonで日付がずれる場合、Timezone設定を直す

現象 JacksonでCSV出力する際、日付がズレて出力される。   原因 タイムゾーンの設定がTokyo/Asiaになっていない。   対策 application.proper …

【Javaポートフォリオ】なぜスクレイピングツールがおすすめか?

なぜスクレイピングツールか? ・スキルに需要がある ・総合的なスキルが身に付く ・個人開発に応用できる スキルに需要がある 執筆時点(2021年3月28日)時点で、ランサーズに1643件の発注がありま …

映画のレイティング判定をStateパターンで実装する

ユーザが見ることができる作品を、映画のレイティングシステムに従って選別できるように実装します。 映画のレイティングシステムとは、年齢制限する規制のことです。 G:全年齢 PG12:12歳以上 R15+ …

SingletonパターンをJUnitでテストする

シングルトンパターンはインスタンスが1つであることを保証する設計です。 Junitを使って、本当に1つだけなのかを検証してみます。 またその手順をテスト駆動開発に従った手順(Red→Green→リファ …

記事を探す

SpringFramworkの良書

■おすすめ教材
Javaの基本を学んだ人が、次のステップとして読む本(中級者向け)

※SpringはJavaのFrameworkの1つです。
変更のしやすさ、保守性の高さが特徴です。