【Spring Security はじめました 】#1 導入

Web

Spring Security ?

Spring Securityは、Spring Frameworkの中で「認証」と「認可」といったセキュリティに関する機能を提供してくれる仕組みのようです。これを使うことでログイン機能やアクセス制御といったことが簡単に実装できるそうで……?

簡単?嘘でしょ?ハッキリ言ってわからない!!

少し調べたのですがあまり理解できていないのが現状です。というわけでここに調べたことをまとめて、実装しながら理解を深めていけたらいいな、という思いのもと記事を書いていきます。

間違ったことを書いていたら申し訳ない!!

認証?認可?

そもそも認証と認可とは何なのか?認証は英語でAuthentication、認可はAuthorizationだそうです(だから何なんだ…)。

単純に日本語で考えた場合、認証は「証を認める」、認可は「できること(可)を認める」となりませんか?

認証

では「証」とは何でしょうか?証と聞いて個人的にイメージしやすいのは運転免許証や学生証といったものです。どちらも本人であることの証になるものですよね?

個人的に最近漫画をBO○K○FFに売りに行ったのですが、本人確認のために運転免許証を提示しました。店員さんは運転免許証を見て本人ということを認めたので、快く?漫画を買い取ってくれました。

回りくどくなってしまいましたがこれが認証です。対象がだれなのか?どのようなものなのか?を何かしらの「証」を基に認めることです。

もっと単純な例を出すと、最近スマホに顔認証なんてありますが、あれは顔を証として本人と認めているのです。

認可

さてもう1つ、認可の「できること」とは何でしょうか?例えば駅の改札を通るには切符が必要になりますよね?(無人駅とか知らん)つまり切符があれば改札を通ることが認められ、なければ通ることが認められないということになります。

これが認可です。少し無理やりですが、切符がある人は改札を通る権限があるから改札を通れる、と言い換えができます。つまり認可とは権限を基に行動を認めることと解釈できます。

システムとしての認証・認可

認証は本人であることを認めることなので、ID・パスワードによる認証(Basic認証)、顔認証や指紋認証などの生体認証などが考えられます。

認可は権限を基に行動を認めることです。例えば管理者ページは管理者の権限があるユーザーしかアクセスできないようにするといったことが考えられます。その他にもAPIへのアクセスはAPI KEYを必要とするといったことも考えられます。

Spring Securityはこのような認証・認可を実装するための仕組みになります。(生体認証はさすがにない)

Spring Securityの導入

この記事ではGradleを使用しているものとします。build.gradleのdependenciesに以下を追加して再ビルドします。

dependencies {
  implementation 'org.springframework.boot:spring-boot-starter-security'
}

試しに適当なページを作成してアクセスしてみます。するとログインフォーム(localhost:8080/login)にリダイレクトされます。

デフォルトではUsernameは「user」、Passwordはサーバー起動時にコンソールに表示されます。

Using generated security password: e8c6e08f-0b8d-49ac-8d36-2f07adc81126」

これを入力してSign inをクリックすると該当のページが表示されます。

ログアウトしたい場合は「localhost:8080/logout」にアクセスし、Log Outをクリックします。

このようにSpring Securityを導入するだけでログイン機能とログアウト機能が追加されます。ただし、このままでは実用的ではないためいろいろと手を加える必要があります。

WebSecurityConfigurerAdapter

Spring Securityの設定を変更するために、設定用のConfigクラスを作成します。名前は適当でも構いませんが、「WebSecurityConfigurerAdapter」という抽象クラスを継承します。また設定用のクラスであることを示すために「@Configuration」を追加します。

@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
  //ここに設定情報を定義していく
}

WebSecurityConfigurerAdapterにはSpring Securityの設定情報が定義されており、対象のメソッドをオーバーライドすることで設定を変更することができます。

ページのアクセス権限

Spring Securityのデフォルトでは、ログイン・ログアウト以外のすべてのページはアクセスのために認証が必要になります。しかし、中には認証を必要としないページがあるかもしれません。

このような設定をする場合は以下のconfigureメソッドをオーバーライドします。以下のコードはWebSecurityConfigureAdapterで実装されている内容です。

@Override
protected void configure(HttpSecurity http) throws Exception {
  http.authorizeRequests().anyRequest().authenticated()
      .and().formLogin()
      .and().httpBasic();
}

このメソッドでは、ページごとのアクセス権限の設定、ログイン処理に関する設定、ログアウト処理に関する設定などを行います。今回はアクセス権限に関することを少しだけ説明します。

例えば「/home」でアクセスできるページに対して、認証を不要としたい場合は次のようにオーバーライドします。

@Override 
protected void configure(HttpSecurity http) throws Exception { 
  http.authorizeRequests().antMatchers("/home") // /homeに一致するリクエストは
                          .permitAll()          // 誰でもアクセス可能
                          .anyRequest()         // その他のリクエストは
                          .authenticated()      // 認証が必要
       .and().formLogin() 
       .and().httpBasic(); 
}

複数設定する場合は「antMatchers(“/hoge”).permitAll()」を続けて設定します。

静的リソースへのアクセス認可

例えば「src/main/resources/static」に「/css/style.css」があり、各ページはこのCSSファイルを読み込んでいるとします。

<link rel="stylesheet" type="text/css" href="/css/style.css">

先程認証を不要とした「/home」にアクセスしても、style.cssの内容は反映されません。実はこのような静的リソースに対しても認証による認可が必要になります。

これを解決するために特定の静的リソースについては認証なしで認可するようにします。

@Override
public void configure(WebSecurity web) throws Exception {
    web.ignoring().antMatchers("/css/**");
}

先程と同じconfigureメソッドですが引数が違います(オーバーロード)。この設定により「/css」以下にあるすべてのファイルへのアクセスは認証が不要となります。対象が複数ある場合はカンマ区切りで設定できます。

認証情報の設定

認証に使用するUsernameとPasswordについては「application.yml(application.properties)」で設定することができます。

spring:
 security:
  user:
   name: hoge
   password: fugafuga

実際にはインメモリに設定する方法やDBから認証(ユーザー)情報を取得する方法などがありますが、この記事では説明しません。

あとがき

Spring Securityについてほんの触りの部分を記載していきました。まだまだ多くの機能があるので少しずつ理解しながらアウトプットしていけたらと思います。

 

- Spring Bootのおすすめ書籍はコチラ -

コメント

タイトルとURLをコピーしました