【Spring Boot】Spring Securityによるログイン認証フィルターの実装(第1編)

Spring Securityによるログイン 認証フィルターの実装(第1編) バックエンド
スポンサーリンク

はじめに

こんにちは。みどりがめです🐢
本記事ではSpring Securityを使用したログイン認証フィルターについてまとめています。

私自身、PHP(Laravel)を使用してログイン認証フィルターの実装を行った経験はあったのですが、Java(Spring Security)では予想以上に時間がかかってしまったため備忘兼ねて詳細に記載していきます。

この記事で分かること
  • Spring Securityの導入方法
  • Spring Securityを使用したログイン認証の実装方法
  • ログインユーザーのロールによる画面制御方法

なお、本記事は2つの記事に分割しておりますので、お手数ですが下記の記事も合わせてご確認いただくようお願いします。

実装概要

ログイン画面

具体的な要件概要としては以下の通りです。

●上記のようなログインフォームに、メールアドレス、パスワードを入力して
 ログインボタンを押下したとき
 ①情報がDBと一致していた場合、ログイン後に遷移可能な画面へ遷移する。
 ②情報がDBと不一致の場合、エラーを表示し画面遷移しない。

●ログイン後に遷移可能となるURLを直接アドレスバーに打ち込んだときに、、、
 ③ログインしている状態であれば該当URLの画面に遷移する。
 ④ログインしてない場合、ログインフォーム画面へ遷移する。

●ログアウトリンクをクリックするとログアウト処理を行い、
 ログイン画面へ遷移する。

開発環境

開発環境は以下の通りです。

  • Java11
  • Spring Boot
  • Spring Security
  • PostgresSQL
  • Spring Tool Suite 4

依存関係ファイル(pom.xml)の編集

pom.xmlに以下の記述を記載します。
Spring Securityを導入するための設定です。
※pom.xmlを編集したらMavenアップデートを行いましょう。

	<dependency>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-security</artifactId>
	</dependency>

HTMLでログイン情報を取得するためには以下も追記する必要があります。

	<dependency>
	    <groupId>org.thymeleaf.extras</groupId>
	    <artifactId>thymeleaf-extras-springsecurity5</artifactId>
	</dependency>

また、私の環境ではその他の依存関係は以下の通りです。

  • thymeleaf
  • バリデーション
  • devtools
  • Spring Web
  • jdbc
  • postgreSQL

設定情報保持クラスの実装

「WebSecutiryConfig.java」を作成し主なSpring Secutiryの設定を記載していきます。
Spring Secutiryを使用する際にはこのような設定用のクラスを作成します。
この記載の内容が本記事の目玉であり最も重要な部分です。
処理の内容についてはコメントに記載していますのでご確認ください。
関連リンクを以下に記載しています。
Spring Secutiry公式
WebSecurityConfigurerAdapter

@Configuration //設定用のクラスであることをSpringに伝える
@EnableWebSecurity //Spring Securityを使うための設定
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
	
	@Autowired
	private UserDetailsService memberDetailsService;

	//   (1)主に全体に対するセキュリティ設定を行う
	//  このメソッドをオーバーライドすることで、
	//  特定のリクエストに対して「セキュリティ設定」を無視する
	//  設定など全体に関わる設定ができる。
	//  具体的には静的ファイルに対してセキュリティの設定を無効にする(静的ファイルのリクエストまで弾かない。)。
	@Override
	public void configure(WebSecurity web)throws Exception{
          web.ignoring().antMatchers("/css/**","/js/**","/images/**");
	}
	
        //  (2)主にURLごとに異なるセキュリティ設定を行う
	//  このメソッドをオーバーライドすることで認可に設定や
	//  ログイン、ログアウトに関する設定ができる。
    @Override
    protected void configure(HttpSecurity http) throws Exception {
       //(2-1)認可に関する設定
    	http.authorizeHttpRequests() 
    	.antMatchers("/","/register","/register/decision").permitAll() //ここに記載したパスは全てのユーザーに許可
    	 // /admin/から始まるパスはADMIN権限でログインしている場合のみアクセス可(権限設定時の「ROLE_」を除いた文字列を指定)
      //.antMatchers("/admin/**").hasRole("ADMIN")
      // /user/から始まるパスはUSER権限でログインしている場合のみアクセス可(権限設定時の「ROLE_」を除いた文字列を指定)
	//.antMatchers("/user/**").hasRole("USER") 
     //それ以外のパスは認証が必要
    	.anyRequest().authenticated(); 
    	
      //(2-2)ログインに関する設定
    	http.formLogin() 
      //ログイン画面に遷移させるパス(ログイン認証が必要なパスを指定してかつログインされていないとこのパスに遷移される。)
    	.loginPage("/") 
    	.loginProcessingUrl("/login") //ログインボタンを押したときに遷移させるパス(ここに遷移させれば自動的にログインが行われる。)
    	.failureUrl("/?error=true") //ログイン失敗時に遷移させるパス
    	.defaultSuccessUrl("/afterLogin/top",true) // 第1引数:デフォルトでログイン成功時に遷移させるパス
								                  // 第2引数: true :認証後常に第1引数のパスに遷移 
	// false:認証されてなくて一度ログイン画面に飛ばされてもログインしたら指定したURLに遷移
    	.usernameParameter("email")     //認証時に使用するユーザー名のリクエストパラメータ名(今回はメールアドレスを使用)
    	.passwordParameter("password"); //認証時に使用するパスワードのリクエストパラメーター名
   
    	http.logout() //(2-3)ログアウトに関する設定
    	.logoutRequestMatcher(new AntPathRequestMatcher("/logout")) //ログアウトさせる際に遷移させるパス
    	.logoutSuccessUrl("/") //ログアウト後に遷移させるパス
    	.deleteCookies("JSESSIONID") //ログアウト後、Cookieに保存されているセッションIDを削除
    	.invalidateHttpSession(true); //ログアウト後、セッションを無効にする false:セッションを無効にしない
    }
    
    //  (3) 主に認証方法の実装の設定を行う
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    	auth.userDetailsService(memberDetailsService)
    	.passwordEncoder(new BCryptPasswordEncoder())
    	;
    }
    
    /**
     * 
     * (4)bcryptアルゴリズムでハッシュ化する実装を返します.
     * これを指定することでパスワードハッシュ化やマッチ確認する際に
     * @Autowired
	 * private PasswordEncoder passwordEncoder;
	 * と記載するとDIされるようになります。
     * @return bcryptアルゴリズムでハッシュ化する実装オブジェクト
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
    		return new BCryptPasswordEncoder();
    }

終わりに

最後にSpring学習のおすすめ教材を紹介します。
多くの方に支持されている人気商品です。気になる方は是非一度、覗いてみてください。

第1編はここまでとなります。お疲れ様でした!第2編は以下の記事になります。
ご覧いただきありがとうございました。ご指摘等がございましたら頂けますと嬉しいです。
引き続き、プログラミングについて定期的に発信していきますのでよろしくお願いします!
また、もしよろしければtwitterもフォローしていただけると嬉しいです!🐢

コメント