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

当ページのリンクには広告が含まれています。
目次

概要

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

参考


後悔しないためのSpring Boot 入門書:Spring 解体新書(第2版): Spring Bootが丸分かり Spring解体新書

最後までお読み頂き、ありがとうございました!
ご意見・ご要望がありましたら、遠慮なくコメント下さい!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

リーマンショックの影響で26歳の時にIT業界から離れ、紆余曲折を経て34歳でエンジニアに復帰しました。
復帰前は開発未経験でしたが、独学した知識と面接時のコミュニケーション力で見事開発エンジニアとして復帰しました!
今はフリーランスエンジニアとして仕事をしています。

■保有資格
・Java Gold SE 11

コメント

コメント一覧 (2件)

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

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

AO へ返信する コメントをキャンセル

CAPTCHA


目次