0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Spring Securityについて理解する②(ユーザ名とパスワードを使用した認証)

Posted at

ユーザ名とパスワードを使用した認証

以下の設定をSecurityConfig.javaに記載するだけで「ユーザー名」と「パスワード」を使用した基本的な認証ロジックを実装できる。

SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {

  @Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  	http
  		.authorizeHttpRequests((authorize) -> authorize
  			.anyRequest().authenticated()
  		)
  		.httpBasic(Customizer.withDefaults())
  		.formLogin(Customizer.withDefaults());

  	return http.build();
  }

  @Bean
  public UserDetailsService userDetailsService() {
  	UserDetails userDetails = User.withDefaultPasswordEncoder()
  		.username("user")
  		.password("password")
  		.roles("USER")
  		.build();

  	return new InMemoryUserDetailsManager(userDetails);
  }

}

Username/Password Authentication

AuthenticationManager Bean

以下のようにAuthenticationManagerを@Beanアノテーションを付けて、Beanとして登録すると

@Service または Spring MVC @Controller などのカスタム認証を可能
Username/Password Authentication

とできる。

  • AuthenticationManager:
    AuthenticationProviderに認証を委譲し、ユーザーが認証できるかどうかの判断を行う。
  • DaoAuthenticationProvider:
    実際の認証を行うクラスで、UserDetailsServicePasswordEncoderを使ってユーザー情報を取得し、パスワードを検証する。
  • UserDetailsService:
    ユーザー情報を提供する役割を担い、AuthenticationProviderがユーザー情報を取得するために使用する。
  • PasswordEncoder:
    パスワードを暗号化し、認証時にパスワードの検証を行う役割がある。
SecurityConfig.java
@Configuration
@EnableWebSecurity
public class SecurityConfig {

  @Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
  	http
  		.authorizeHttpRequests((authorize) -> authorize
  			.requestMatchers("/login").permitAll()
  			.anyRequest().authenticated()
  		);

  	return http.build();
  }

  @Bean
  public AuthenticationManager authenticationManager(
  		UserDetailsService userDetailsService,
  		PasswordEncoder passwordEncoder) {
  	DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
  	authenticationProvider.setUserDetailsService(userDetailsService);
  	authenticationProvider.setPasswordEncoder(passwordEncoder);

  	return new ProviderManager(authenticationProvider);
  }

  @Bean
  public UserDetailsService userDetailsService() {
  	UserDetails userDetails = User.withDefaultPasswordEncoder()
  		.username("user")
  		.password("password")
  		.roles("USER")
  		.build();

  	return new InMemoryUserDetailsManager(userDetails);
  }

  @Bean
  public PasswordEncoder passwordEncoder() {
  	return PasswordEncoderFactories.createDelegatingPasswordEncoder();
  }

}

Username/Password Authentication

認証の流れ

認証の流れとしては以下となる。

@Bean
	public AuthenticationManager authenticationManager(
			UserDetailsService userDetailsService,
			PasswordEncoder passwordEncoder ①) {
		DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider();
		authenticationProvider.setUserDetailsService(userDetailsService); ②③
		authenticationProvider.setPasswordEncoder(passwordEncoder); ②③

		return new ProviderManager(authenticationProvider); ④
	}

①ユーザーがログインしようとすると、ユーザー名とパスワードがAuthenticationManagerに渡される
AuthenticationManagerは、このリクエストをDaoAuthenticationProviderに渡す
DaoAuthenticationProviderは、UserDetailsServiceを使ってユーザー情報を取得し、PasswordEncoderでパスワードを検証する
④認証が成功すれば、認証済みのAuthenticationオブジェクトを返し、失敗すれば例外を投げる

認証ロジックのカスタマイズ

また、以下の部分をカスタムすることで、様々な認証ロジックを実装することができる。

// 固定値での認証
@Bean
	public UserDetailsService userDetailsService() {
		UserDetails userDetails = User.withDefaultPasswordEncoder()
			.username("user")
			.password("password")
			.roles("USER")
			.build();

		return new InMemoryUserDetailsManager(userDetails);
	}
// カスタムでの認証
@Bean
	public UserDetailsService userDetailsService() {
		
// カスタムロジックを記述

		return new InMemoryUserDetailsManager(userDetails);
	}

参考

以下のSpring Securityの公式ドキュメントを参考にしました。
Username/Password Authentication

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?