Keselamatan Spring dan Pengesahan JWT · Pelajaran

Integrasi Pengurusan Pengguna Pangkalan Data

Integrasikan Spring Security dengan pangkalan data untuk mengurus dan mengesahkan pengguna yang disimpan dalam sumber data berterusan.

Pelajaran 3 daripada 411 langkah

Integrasi Pengurusan Pengguna Pangkalan Data ialah pelajaran Keselamatan Spring dan Pengesahan JWT percuma di CoddyKit. Ini ialah pelajaran 3 daripada 4. Sebanyak 3 pelajaran dalam laluan pembelajaran ini boleh dibaca sepenuhnya secara percuma — selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan praktikal dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran Keselamatan Spring dan Pengesahan JWT, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus Keselamatan Spring dan Pengesahan JWT merangkumi sejumlah 4 pelajaran.

Pangkalan Data untuk Pengurusan Pengguna

Selamat datang! Setakat ini, kita telah menggunakan pengguna dalam memori. Namun, aplikasi sebenar perlu menyimpan data pengguna secara kekal. Di sinilah pangkalan data digunakan!

Dalam pelajaran ini, anda akan mempelajari cara mengintegrasikan Spring Security dengan pangkalan data untuk mengurus dan mengesahkan pengguna aplikasi anda.

Mengapakah Menggunakan Pangkalan Data?

Menyimpan pengguna dalam pangkalan data memberikan beberapa manfaat utama:

  • Kekekalan: Data pengguna tidak hilang apabila aplikasi anda dimulakan semula.
  • Kebolehskalaan: Urus sejumlah besar pengguna dengan mudah.
  • Fleksibiliti: Simpan atribut pengguna tambahan (contohnya, e-mel, peranan, maklumat profil).
  • Pengurusan Berpusat: Satu sumber rujukan yang sah untuk semua data pengguna.

Jadual Pengguna Asas

Mula-mula, kita memerlukan jadual pangkalan data untuk menyimpan pengguna. Jadual users ringkas dan jadual authorities (untuk peranan) mungkin kelihatan seperti ini:

Jadual ini biasanya mengandungi sekurang-kurangnya nama pengguna, kata laluan dan status 'enabled' pengguna, serta nama pengguna dan autoriti (peranan) untuk keizinan.

CREATE TABLE users (
  username VARCHAR(50) NOT NULL PRIMARY KEY,
  password VARCHAR(500) NOT NULL,
  enabled  BOOLEAN NOT NULL
);

CREATE TABLE authorities (
  username VARCHAR(50) NOT NULL,
  authority VARCHAR(50) NOT NULL,
  CONSTRAINT fk_authorities_users FOREIGN KEY (username) REFERENCES users (username)
);

UserDetailsService Tersuai

Ingat bahawa UserDetailsService ialah antara muka teras yang digunakan oleh Spring Security untuk mendapatkan butiran pengguna. Untuk integrasi pangkalan data, kita akan mencipta atau menggunakan pelaksanaan yang mendapatkan data pengguna daripada pangkalan data kita.

Perkhidmatan ini membina objek UserDetails (yang mengandungi nama pengguna, kata laluan dan peranan) daripada data yang diperoleh.

package org.springframework.security.core.userdetails;

public interface UserDetailsService {
  UserDetails loadUserByUsername(String username)
      throws UsernameNotFoundException;
}

Menggunakan JdbcUserDetailsManager

Spring Security menyediakan JdbcUserDetailsManager, iaitu pelaksanaan terbina dalam UserDetailsService yang mudah digunakan dan menggunakan JDBC (Java Database Connectivity) untuk berinteraksi dengan pangkalan data anda.

Ia menjangkakan skema jadual tertentu (seperti yang ditunjukkan sebelum ini) untuk berfungsi dengan betul. Anda hanya perlu membekalkan DataSource kepadanya.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import javax.sql.DataSource;

@Configuration
public class UserManagementConfig {

  @Bean
  public UserDetailsService userDetailsService(DataSource dataSource) {
    JdbcUserDetailsManager userDetailsManager = new JdbcUserDetailsManager(dataSource);
    // Custom queries can be set if your schema differs:
    // userDetailsManager.setUsersByUsernameQuery("SELECT ...");
    // userDetailsManager.setAuthoritiesByUsernameQuery("SELECT ...");
    return userDetailsManager;
  }
}

Penyimpanan Kata Laluan Selamat

Apabila menyimpan kata laluan dalam pangkalan data, amat penting untuk tidak menyimpannya dalam teks biasa. Sentiasa gunakan Password Encoder untuk mencincangnya dengan selamat.

BCryptPasswordEncoder ialah pilihan yang popular dan kukuh, yang menyediakan pencincangan satu hala yang kuat untuk kata laluan.

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
public class PasswordEncoderConfig {

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

Menyambungkan Pengesahan

Untuk melengkapkan integrasi, kita perlu memberitahu Spring Security supaya menggunakan UserDetailsService berasaskan pangkalan data kita dan PasswordEncoder yang dipilih.

Hal ini biasanya dilakukan dengan mengkonfigurasi SecurityFilterChain, tempat kita menetapkan komponen ini secara jelas untuk pengesahan.

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.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig {

  private final UserDetailsService userDetailsService;
  private final PasswordEncoder passwordEncoder;

  public WebSecurityConfig(UserDetailsService userDetailsService, PasswordEncoder passwordEncoder) {
    this.userDetailsService = userDetailsService;
    this.passwordEncoder = passwordEncoder;
  }

  @Bean
  public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
      .authorizeHttpRequests(authorize -> authorize
        .anyRequest().authenticated()
      )
      .formLogin(form -> form.permitAll())
      .userDetailsService(userDetailsService)
      .passwordEncoder(passwordEncoder);
    return http.build();
  }
}

Contoh Pengesahan Pangkalan Data Lengkap

Berikut ialah aplikasi Spring Boot lengkap yang boleh dijalankan. Aplikasi ini menggunakan pangkalan data H2 dalam memori, JdbcUserDetailsManager dan BCryptPasswordEncoder. Aplikasi ini juga mencipta beberapa pengguna awal.

Jalankan aplikasi tersebut, kemudian cuba akses /hello. Anda akan diminta untuk log masuk dengan 'user'/'password' atau 'admin'/'adminpass'.

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseBuilder;
import org.springframework.jdbc.datasource.embedded.EmbeddedDatabaseType;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.JdbcUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.sql.DataSource;

@SpringBootApplication
@RestController
public class DatabaseAuthApp {

  public static void main(String[] args) {
    SpringApplication.run(DatabaseAuthApp.class, args);
  }

  @GetMapping("/hello")
  public String hello() {
    return "Hello, secured world!";
  }

  @Configuration
  @EnableWebSecurity
  static class WebSecurityConfig {

    // 1. Configure DataSource for H2 in-memory database
    @Bean
    public DataSource dataSource() {
      return new EmbeddedDatabaseBuilder()
          .setType(EmbeddedDatabaseType.H2)
          .addScript("classpath:org/springframework/security/core/userdetails/jdbc/users.ddl")
          .build();
    }

    // 2. Configure JdbcUserDetailsManager to use the DataSource
    @Bean
    public UserDetailsService userDetailsService(DataSource dataSource, PasswordEncoder passwordEncoder) {
      JdbcUserDetailsManager userDetailsManager = new JdbcUserDetailsManager(dataSource);

      // Create initial users if they don't exist
      if (!userDetailsManager.userExists("user")) {
        UserDetails user = User.builder()
            .username("user")
            .password(passwordEncoder.encode("password"))
            .roles("USER")
            .build();
        userDetailsManager.createUser(user);
      }
      if (!userDetailsManager.userExists("admin")) {
        UserDetails admin = User.builder()
            .username("admin")
            .password(passwordEncoder.encode("adminpass"))
            .roles("ADMIN", "USER")
            .build();
        userDetailsManager.createUser(admin);
      }
      return userDetailsManager;
    }

    // 3. Configure PasswordEncoder
    @Bean
    public PasswordEncoder passwordEncoder() {
      return new BCryptPasswordEncoder();
    }

    // 4. Configure SecurityFilterChain
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
      http
        .authorizeHttpRequests(authorize -> authorize
          .requestMatchers("/admin/**").hasRole("ADMIN") // Example role-based access
          .anyRequest().authenticated()
        )
        .formLogin(form -> form
          .permitAll()
        )
        .logout(logout -> logout
          .permitAll()
        )
        .userDetailsService(userDetailsService(dataSource(), passwordEncoder())); // Explicitly set
      return http.build();
    }
  }
}

Menguji Pengesahan Pangkalan Data

Setelah aplikasi anda berjalan, buka pelayar dan pergi ke titik akhir yang dilindungi (contohnya, /hello dalam contoh kita).

Anda sepatutnya diubah hala ke halaman log masuk. Cuba log masuk menggunakan kelayakan yang dimasukkan ke dalam pangkalan data:

  • Nama pengguna: user, Kata laluan: password
  • Nama pengguna: admin, Kata laluan: adminpass

Log masuk yang berjaya bermakna integrasi pangkalan data anda berfungsi!

Semakan Pengesahan Pangkalan Data

Komponen Spring Security manakah yang penting untuk memuatkan data pengguna daripada pangkalan data?

Ulang Kaji & Langkah Seterusnya

Syabas! Anda telah berjaya mempelajari cara mengintegrasikan Spring Security dengan pangkalan data.

  • Kita memahami manfaat pengurusan pengguna berasaskan pangkalan data.
  • Kita meneroka skema jadual pengguna asas.
  • Kita melihat cara menggunakan UserDetailsService (khususnya JdbcUserDetailsManager) dan PasswordEncoder dengan pangkalan data.
  • Kita mengkonfigurasi Spring Security untuk menggunakan komponen ini.

Ini ialah langkah asas untuk membina aplikasi yang kukuh dan selamat. Seterusnya, anda akan mendalami kebenaran untuk mengawal perkara yang boleh dilakukan oleh pengguna yang telah disahkan!

Percuma untuk bermula

Pelajari Java dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
12
Pelajaran
48

Soalan Lazim

Adakah pelajaran “Integrasi Pengurusan Pengguna Pangkalan Data” percuma?

Ya — sebanyak 3 pelajaran dalam laluan pembelajaran Keselamatan Spring dan Pengesahan JWT, termasuk “Integrasi Pengurusan Pengguna Pangkalan Data”, boleh dibaca sepenuhnya secara percuma di web ini. Selepas itu, CoddyKit PRO membuka akses kepada semua pelajaran, serta latihan interaktif dengan penyunting kod terbina dalam dan tutor kecerdasan buatan yang tersedia 24/7. Kursus Keselamatan Spring dan Pengesahan JWT merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Integrasi Pengurusan Pengguna Pangkalan Data”?

Integrasikan Spring Security dengan pangkalan data untuk mengurus dan mengesahkan pengguna yang disimpan dalam sumber data berterusan. Anda berlatih Keselamatan Spring dan Pengesahan JWT menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan Keselamatan Spring dan Pengesahan JWT?

Tiada pengalaman terdahulu diperlukan. Pembelajaran Keselamatan Spring dan Pengesahan JWT di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 3 daripada 4.

Berapa lamakah pelajaran “Integrasi Pengurusan Pengguna Pangkalan Data” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran Keselamatan Spring dan Pengesahan JWT ini?

Ya. Setiap pelajaran Keselamatan Spring dan Pengesahan JWT menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Pelaksanaan UserDetailsService Tersuai
  2. Memahami Pengekod Kata Laluan
  3. Integrasi Pengurusan Pengguna Pangkalan Data
  4. Kebenaran Berasaskan Peranan dengan Granted Authorities
← Kembali ke Keselamatan Spring dan Pengesahan JWT