@yengineer

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

SpringSecurity ログイン機能実装

解決したいこと

SpringSecurity機能を利用してMySQLに登録されているusernameとpasswordを利用して
ログイン機能を実装したい

@Configuration
@EnableWebSecurity
public class SecurityConfig {

  // パスワードの暗号化
  @Bean
  PasswordEncoder passwordEncoder() {
    return new BCryptPasswordEncoder();
  }

  @Bean
  InMemoryUserDetailsManager userDetailsService() {
	  
    // 管理者設定
    UserDetails admin = User
        .withUsername("admin")
        .password(passwordEncoder().encode("admin"))
        .roles("ADMIN")
        .build();

    // ユーザー設定
    UserDetails user = User
        .withUsername("user")
        .password(passwordEncoder().encode("user"))
        .roles("USER")
        .build();
    
    return new InMemoryUserDetailsManager(admin, user);
    
  }

  

}

ご回答よろしくお願いします

0 likes

2Answer

もしかしてこのサイトが役に立つでしょうか?どのような方式でどのような目的でSpring Securityを使用するサービスなのかわからないので、どこから説明すればよいのかわかりません。

1Like

これは質問ではなく、実装のお願い(丸投げ)ですよね…

今後、質問者さんがエンジニアとして、成長していきたいのであれば、困っている事、分からない事を整理してから質問するクセを付けた方が良いと思います。
※社会人として必須のスキルになります

ちなみに

依頼内容をコピペでChatGPTに投げると以下でした。
多分、それっぽくできているので、試してみてください。
今は便利なAIがありますので、活用をオススメします👍


Spring Securityを使ってMySQLに登録されているusernamepasswordを利用したログイン機能を実装する手順を以下にまとめます。

1. 依存関係の追加

pom.xml に必要な依存関係を追加します。特に、Spring Security、Spring Data JPA、MySQLドライバの依存関係が必要です。

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

    <!-- Spring Data JPA -->
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>

    <!-- MySQL Driver -->
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
    </dependency>
</dependencies>

2. データベース設定

application.properties または application.yml にMySQLの接続情報を設定します。

spring.datasource.url=jdbc:mysql://localhost:3306/your_database_name
spring.datasource.username=your_username
spring.datasource.password=your_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

3. ユーザーエンティティの作成

ユーザー情報を保存するためのエンティティクラスを作成します。

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String username;
    private String password;
    private String role;

    // Getters and Setters
}

4. ユーザーリポジトリの作成

User エンティティに対応するリポジトリを作成します。

import org.springframework.data.jpa.repository.JpaRepository;

public interface UserRepository extends JpaRepository<User, Long> {
    User findByUsername(String username);
}

5. UserDetailsServiceの実装

Spring Securityの UserDetailsService を実装して、データベースからユーザー情報を取得するロジックを定義します。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.core.userdetails.User;
import org.springframework.stereotype.Service;

@Service
public class MyUserDetailsService implements UserDetailsService {

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        User user = userRepository.findByUsername(username);
        if (user == null) {
            throw new UsernameNotFoundException("User not found");
        }
        return new org.springframework.security.core.userdetails.User(user.getUsername(), user.getPassword(), new ArrayList<>());
    }
}

6. セキュリティ設定のカスタマイズ

セキュリティ設定をカスタマイズして、Spring Securityに MyUserDetailsService を使用させます。

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.dao.DaoAuthenticationProvider;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
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.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private UserDetailsService userDetailsService;

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

    @Bean
    public DaoAuthenticationProvider authenticationProvider() {
        DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider();
        authProvider.setUserDetailsService(userDetailsService);
        authProvider.setPasswordEncoder(passwordEncoder());
        return authProvider;
    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(authenticationProvider());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/login").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }
}

7. パスワードのエンコーディング

MySQLに保存するパスワードは、セキュリティのためにハッシュ化されるべきです。Spring Securityの BCryptPasswordEncoder を使って、パスワードをエンコードし、データベースに保存します。

例えば、新しいユーザーを作成する際に以下のようにエンコードします。

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String encodedPassword = encoder.encode("plain_password");

8. ログインページの作成

カスタムのログインページを作成します。Spring Securityのデフォルトのログインページを使うか、自分で login.html を作成して使うことができます。


以上で、Spring Securityを利用してMySQLのデータベースと連携したログイン機能を実装する準備が整います。この手順を基に、さらに要件に合わせてカスタマイズが可能です。

0Like

Your answer might help someone💌