プログラミング 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アノテーションを付ける。
  • デフォルトのログイン画面が用意されているので、カスタマイズしたい場合のみ作成する。
  • ログアウトはデフォルトの機能が用意されているので、カスタマイズしたい場合は実装を行う。

参考

SpringSecurityについてもう一歩踏み込んで学んでみたい人向けの教科書
Spring解体新書 セキュリティ編 Spring Securityを徹底解説: 記憶喪失になっても忘れはいけないセキュリティ対策集

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

ランキング評価する

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

執筆者:


  1. AO より:

    参考にさせていただいております。
    ログイン認証については初心者なのでよくわかりません。
    上記と同じように実装し、Customerテーブルに同じようにINSERTしました。
    さて、ログイン画面を表示したのですがそれからINSERTしたデータにもとづいてどのようにパスワードを入力したらいいのか。よくわかりません。
    また、新たにユーザーを登録する場合はどうすればよいのでしょう。
    その辺をご説明いただけると嬉しいです。
    よろしくお願いいたします。

  2. AO より:

    他のサイトを参照しなんとか理解できましたので、質問は取り下げます。
    お手数をおかけしてすみませんでした。

comment

メールアドレスが公開されることはありません。

CAPTCHA


関連記事

【Java入門】メソッドとは?使い方まとめ

概要 メソッドとは何か? また使い方をわかり易く説明します。   メソッドとは? 固く言うと、一連の処理を一つにまとめたものです。 平たく言うと、何らかの処理を1つにまとめたものです。 例 Syste …

【Java】オブジェクト指向の練習題材(成績オブジェクト)

前回記事、オブジェクト指向とは何なのかを簡単に説明してみるの練習題材です。 ここでは2つのオブジェクトを作成していきます。 成績オブジェクト:教科と点数などを保持 生徒オブジェクト:氏名と成績を保持 …

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

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

PC, タイピング, パソコン

コミュニティ内のハッカソンに参加した体験談

クローズドなコミュニティ内で行われたハッカソンに参加してきました。 ハッカソンは短期間(短時間)で要件定義から実装までを行うイベントです。 ハッカソンに参加することになったきっかけは「要件定義から実装 …

【Java入門】起動パラメータを付けて起動してみよう!

概要 Javaプログラムを起動する際に、何らかのパラメータ(値)を付けて起動することができます。 今はこのメリットがわからないと思いますが、そういうことができるんだなというレベルで理解しておいて頂けれ …

SpringFramworkの良書

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

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