はじめに
第1章 Spring Securityによる認証とユーザー登録
第2章 デプロイ
あとがき
この本を手に取っていただきどうもありがとうございます。著者のFORTE(フォルテ)です。前著である「入門!実践!サーバーサイドKotlin」に引き続き、今回もサーバーサイドKotlin本を書きました。本書も前著と同じくWindows、Mac両対応です。IDEについては特に影響する箇所はないはずなので、前著を読んでいれば問題ないはずです。もし本著の内容で分からない点があれば前著を見るか、ぜひ著者1までご一報ください。ベストエフォートで回答させていただきます。
今回はもっと実践!ということで、コンシューマー向けのWebサービスでは必ずと言ってよいほど使われる「ユーザー登録と認証」と「アプリケーションを公開する」という2点に関して実践してみた結果を解説しました。
ユーザー登録と認証は、その性質上ユーザーの個人情報を預かる可能性や外部に公開したくない情報を預かる可能性が高くなります。そのためセキュリティや脆弱性に一層気を使う必要がある部分となります。今回は本番運用できるレベルと自信を持っていえるわけではありませんが、実装例と動作するコードを公開しています。ゆくゆくは私が個人サービスとして公開、運用した知見を持って本番運用できるレベルのコード、解説をしていきたいと思っています。ですが、今回はあくまで基礎レベルの解説となります。
アプリケーションを公開するということは、一般にデプロイと呼ばれている作業になります。今回はデプロイ先としてherokuを用いました。heroku(ヘロク)はサンプルや小規模なアプリを公開する分には非常に便利なサービスです。今回はherokuを用いることでSpring Bootアプリケーションを動作させるまでの苦労がほぼなくなったといえるくらい簡単にできました。今回はデプロイの手順をWindows、Macの両方で解説し、アプリケーションをリリースするというもっともモチベーションが上がる行為を解説していきます。
本著は前著「入門!実践!サーバーサイドKotlin」を読んでいる前提としています。具体的にはKotlin+Spring Boot+JPA+Thymeleaf+データベース(h2 Databaseなど)でデータ作成、検索、更新、削除(いわゆるCRUD処理)が分かる、やったことがある、開発環境などもすでにある、あるいは自分で揃えられる程度の方を対象読者としています。
そのため、サーバーサイドKotlinとは?Spring Bootとは?えっそもそもKotlinってなに?読み方もわからない…という人はぜひ前著である「入門!実践!サーバーサイドKotlin」をお読みになることをお勧めします。同じく「技術の泉シリーズ」から出版されております。
この本はJavaなどでWeb開発の経験がある人向けにサーバーサイドKotlinでユーザー認証と認可、デプロイを実践してみる本です。この本を読み終わると次のような状態になります。
・Spring Securityによる認証の使い方が分かる
─ユーザー登録
─ユーザー認証
─デフォルトユーザーの作成
─認証関係のテストの書き方
・herokuへのデプロイ
─herokuのユーザー登録
─データベース接続情報のマスクの仕方
あなたの「KotlinでWebアプリケーションを作りたい、個人サービスを作ってみたい」という思いに応えられたらこんなにうれしいことはありません。
本著ではSpring Securityやherokuの解説をしていますが、あくまで使い方のみであり、詳細な仕組みや中身のソースコードについては解説していません。
Spring Securityについては完璧なセキュリティを保証するものではありません。あくまでサンプルソースであり、本番環境での動作実績やなにかの脆弱性診断をパスしているものではありません。
また解説にはJPAやThymeleafも使用していますが、本著では解説しません。よくわからない!という方はぜひ前著をご覧になることをお勧めします。
この本は筆者がサーバーサイドKotlinによるユーザー登録、認証やデプロイを学ぶ中で疑問に思ったことや調べたことを技術書の形でアウトプットしたものです。そのため、ユーザー認証や登録について知りたければ第1章「Spring Securityによる認証とユーザー登録」のページからご覧ください。またとりあえずデプロイをしてみたい!ということであれば第2章「デプロイ」からご覧ください。もちろん最初から全部読んでいただいても大丈夫です。
本書はこの本のとおりにやれば動くものができる、というところを目指して書かれています。この本を読めば理屈や仕組みがすべて理解できるようには書かれていません。この本を入り口としてそのさらに奥にあることに興味を持っていただけたら幸いです。
特にユーザー認証、認可についてはこれを利用することでさまざまなアプリケーション開発が可能になると思います。ぜひ、これを利用して自分用のツールを作ったりしてみてください。
また、この本のコラムでは勉強記録として私が感じたポイントやハマったポイントなどを解説しています。たとえばこまめにビルドすると効率がいいよーとか、前著からどれくらい成長できているか?みたいな話をしています。Kotlinと直接関係ない話をしているかもしれませんが、よかったら見てみてください。
読み終わった感想や間違いの指摘、追加要望などは次のハッシュタグを用いてTwitterで呟いていただけると嬉しいです。ぜひ、感想をお待ちしております。
#もっと実践サーバーサイドKotlin
本書に記載する内容は筆者の所属する組織の公式見解ではありません。また、本書は可能な限り正確を期すように努めていますが、筆者がその内容を保証するものではありません。そのため、本書の記載内容に基づいた読者の行為、及び読者が被った損害について筆者はなんら責任を負うものではありません。
Spring Securityは認証およびアクセス制御フレームワークです。名前のとおりSpringフレームワークの一部であり、Springはもちろん、Javaアプリケーションに「認証」と「認可」の両方を提供することができます。そして強力であり、高度にカスタマイズ可能となっています。
ここでいう認証とはアクセスしてきたユーザーを識別し本当に本人であることを確認することです。具体的にはパスワードによる確認になります。そのため、パスワードは当人しか知らないものであるという前提となっています。なお、ユーザーのIDは認証ではなく、ユーザーを識別するためのものになります。
次に認可とは、そのユーザーの属性に応じてアクセスできる範囲を確認することです。たとえば管理者画面には管理者しかアクセスできない、ユーザー画面にはそのユーザーしかアクセスできないなどが認可となります。本著ではRoleという属性でそのユーザーアクセスできる範囲を制御しています。
公式ページ(英語)は次になります。
本著は前著「入門!実践!サーバーサイドKotlin」に引き続いていますので、そのプロジェクトを引き継いで解説していきます。もし本著から購入された場合は次のURLより前著の最後の状態のプロジェクトをダウンロードしてください。
https://github.com/fortegp05/server_side_kotlin_bbs_sample/releases/tag/ssk1
もちろん前著をご購入頂いて、一から始めていただいても大丈夫です。【PR】
https://fortegp05.booth.pm/items/1560389
なお、本書でご紹介しているソースコードの完成品は次のGithubリポジトリーにアップロード済みです。
https://github.com/fortegp05/server_side_kotlin_bbs_sample
また、同じ内容をJavaで表現したソースコードもご用意してあります。よかったら併せてご利用ください。
https://github.com/fortegp05/java_bbs_sample
・Windows:Windows 10 Version 1903(OS Build 18362. 592)
・IntelliJ IDEA(Community):2019.2.1 192.6262.58
・VS Code:Version 1.38.0
・macOS:macOS Catalina 10.15.1
・IntelliJ IDEA(Community):2019.1.3 191.7479.19
・VS Code:Version 1.41.1
・Spring Boot 2.1.8
・Java:12.0.2
それではSpring Securityを用いて簡単にユーザー認証をしてみます。拍子抜けするほど簡単にできますので、一緒にやってみましょう。まずはspring-boot-starter-securityをbuild.gradle.ktsに追加します。
implementation("org.springframework.boot:spring-boot-starter-security")
BootRunして「http://localhost:8080」にアクセスしてみます。すると、次のような認証画面が出ます。
このユーザーのUsernameはuser、パスワードは次の形式で起動時のログに出ます。
Using generated security password: f6e32e29-ab80-4f5a-a22c-ce0b48b0eadb
この情報でログインすると掲示板画面が表示されます。