プログラミング 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】IllegalArgumentExceptionの原因と対策方法

IllegalArgumentExceptionの原因と対策方法はとても簡単です。 基本的なことを理解すればすぐに解消できます。 IllegalArgumentExceptionとは? 不正な引数また …

メソッドを切り出すメリット。リーダブルなコードで行こう!

概要 大きなクラス、長いメソッドを書いたり読んだりしていて、ロジックが追えなくなってきています。 私の周りではすごく理解が良く、長い処理でも追っていける人がいますが私はそうではありません。 私はごくご …

【Java】HashSet、LinkedHashSet、TreeSetの違い

概要 重複しないリストは、「Setに格納することで重複を除外してくれる」というのは多くの記事で紹介されています。 ここでは、Setに格納した後のデータの並び順も考慮したいという要件に対応するために、3 …

【Java】Optionalとは何か?どのように使うのか?

Optionalとは? JavaのOptionalクラスは、値がnullである可能性がある場合に値をラップするためのクラスです。 例えば、Mapから値を取得する際に値が存在しない場合、値はnullにな …

Git BashでUniCodeに文字化けする時の対処法

大変参考になったサイトのエイリアスです。 git diff や git status での日本語の文字化けを防ぐ (core.page, core.quotepath) 私は自分のブログをリファレンス …

■運営者プロフィール
IT業界10年のエンジニア。
PHP -> VBA -> Javaと渡り歩いてきて、今はJavaをメインにフリーランスエンジニアとして活躍中!

[保有資格]
・Java SE 11 Gold

一度はエンジニアを辞めざるを得なかった私が再びエンジニアとして復活した数奇な物語

SpringFramworkの良書

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

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