🙆‍♀️

Springbootベースで始まるSpring Security(3)

2022/11/10に公開

初めまして、Junior Back-end Developer、SIMOKITAZAWAです。
色々と足りないところがあるかと思いますがよろしくお願い致します。

私がZENNを始めた理由は、

  1. 私が勉強したことをまとめたい
  2. 勉強の内容を共有して一緒に成長したい
  3. 私が間違って理解している部分について先輩たちに教えてもらいたい

このような理由で始めることになりました。
たくさんの教えをお願いします。

Form Login認証

http.formLogin() Form login認証の機能が始めます。

 http.formLogin()
                .loginPage(“/login.html")   		           
                .defaultSuccessUrl("/home)			
	        .failureUrl("/login.html?error=true“)	
                .usernameParameter("username")		
                .passwordParameter(“password”)		
                .loginProcessingUrl(“/login")		
                .successHandler(loginSuccessHandler())	
                .failureHandler(loginFailureHandler())
		
		// ユーザー定義ログインページ
		// ログイン成功後の移動ページ
		// ログイン失敗後の移動ページ
		// IDパラメータ名設定
		// パスワードパラメータ名の設定
		// ログインFormActionUrl
		// ログイン成功後、Handler
		// ログインに失敗した後、Handler
  • .loginPage(“/login.html")
    springsecurityが基本的にログインページを提供します。
    (URL)を書くと、自分で作ったログインページを使用し、自分で作ったログインページを利用して認証処理をします。

  • .defaultSuccessUrl("/home) .failureUrl("/login.html?error=true“)
    (URL)ログイン成功後、どのページに移動するかを設定できます。
    (URL)ログイン失敗後、どのページに移動するかを設定できます。

  • .usernameParameter("username").passwordParameter(“password”) 
    username、passwordparameterを変更できます。
    基本的なデフォルト値は、username、passwordです。
    もしusernameをemailで受け取りたい場合は("email")、passwordをphoneNumberで受け取りたい場合は("phoneNumber")にしてください。UI画面でもform tag名も変えて送ってください。

  • .loginProcessingUrl(“/login")
    form tagでAction Url設定通り変更できます。UI画面でもform tag名も変えて送ってください。

  • .successHandler(loginSuccessHandler()).failureHandler(loginFailureHandler())
    ログイン成功、失敗後のhandler設定classで、その後の作業を処理します。

.defaultSuccessUrl("/home)			
.failureUrl("/login.html?error=true“)

.successHandler(loginSuccessHandler())	
.failureHandler(loginFailureHandler())

一般的にHandlerが付いたApiを使用する場合、よりカスタムにロジックを構成できます。
例えば、successUrlは認証が成功した場合、移動できる経路のみ指定できるのに対し、
successHandlerは、HttpServletRequest、HttpServletResponse、AuthenticationのようなParameterが伝達されるため、これを活用して、必要なビジネスロジックを構成できるメリットがあります。

使ってみましょう

public class SecurityConfig{

    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
                .authorizeRequests()
                .anyRequest().authenticated();
        http
                .formLogin()
                .loginPage("/loginPage")
                .defaultSuccessUrl("/")
                .failureUrl("/login")
                .usernameParameter("userId")
                .passwordParameter("pass")
                .loginProcessingUrl("/login_test")
                .successHandler(new AuthenticationSuccessHandler() {
                    @Override
                    public void onAuthenticationSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
                        System.out.println("authentication.getName() = " + authentication.getName());
                        response.sendRedirect("/");
                    }
                })
                .failureHandler(new AuthenticationFailureHandler() {
                    @Override
                    public void onAuthenticationFailure(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException {
                        System.out.println("exception.getMessage() = " + exception.getMessage());
                        response.sendRedirect("/login");
                    }
                })
                .permitAll()
        ;
        return http.build();
    }
}


上はOld Versionで、下はNew Versionです。

コードを読んでみましょう。
authorizeRequests → 認可要請があれば、
anyRequest().authenticated(); → どんな要請でも認証が必要だ。
formLogin() → ログインページを提供してくれ
loginPage("/loginPage") → ログインページは私が作った"loginPage"で使うよ、ここに移動してね。
defaultSuccessUrl("/") → ログインが成功したらhomeに戻ってね。
failureUrl("/login") → 失敗したらまたログインページに行ってね。
usernameParameter("userId") → username parameterはuserIdに変える。
passwordParameter("pass") → password parameterはpassに変えるloginProcessingUrl("/login_test") → ActionLoginUrlをlogin_testに変える。
successHandler → ログインに成功したら認証したオブジェクトの名前を教えて、そしてhomeに行って。
failureHandler → ログインに失敗したらexception messageを見せて、そしてまたログインページに行ってね。

.permitAll() → 上のURLのrequestは認証しなくても良い。

意味です。全てのrequestには認証が必要なのでエンジニアが設定したURLも認証が必要です。
そのため、認証しなくても入れるように.permitAll()しました。

今回はここまでです。
ありがとうございました。

Discussion