LAPOZ-AI
About

Welcome to our Website
LAPOZ-AI

Start a conversation with AI with GPT!

今さらSpringBoot Securityの使い方を学んでみた

Blogthumbnail

2022年06月23日

Spring SecurityはJavaによるエンタープライズ向けアプリケーションのためのセキュリティフレームワークで、認証と認可、CSRF保護、セッション管理など、アプリケーションのセキュリティを提供します。

依存関係の追加

まずはSpring Securityをプロジェクトに追加する必要があります。Gradleを使用している場合、build.gradleに以下の行を追加します

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

Mavenを使用している場合は、pom.xmlに以下の依存関係を追加します

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

Security Configurationクラスの作成

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfiguration extends WebSecurityConfigurerAdapter {

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

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

ユーザーの詳細を提供

上記の設定では全てのリクエストは認証が必要になりますが、まだユーザー詳細を提供していません。以下のコードはInMemoryUserDetailsManagerを使用し、メモリ内でユーザーを管理する例です

import org.springframework.context.annotation.Bean;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        InMemoryUserDetailsManager userDetailsService = new InMemoryUserDetailsManager();
        userDetailsService.createUser(User.withUsername("user").password(passwordEncoder().encode("password")).roles("USER").build());
        
        auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}