Rumah >Java >javaTutorial >Sistem log masuk dengan token JWT dan kata laluan tetapan semula e-mel

Sistem log masuk dengan token JWT dan kata laluan tetapan semula e-mel

Barbara Streisand
Barbara Streisandasal
2024-11-24 22:48:13377semak imbas

Login system with JWT token and email reset password

pengenalan

Aplikasi Log Masuk Musim Bunga ialah sistem pengurusan pengguna yang selamat dan teguh dibina menggunakan Spring Boot. Projek ini menunjukkan pendekatan moden untuk melaksanakan fungsi pengesahan, kebenaran dan akaun pengguna. Ciri utama termasuk pendaftaran pengguna, pengendalian kata laluan selamat dengan BCrypt, tetapan semula kata laluan berasaskan e-mel dan pengesahan JWT (JSON Web Token). Direka bentuk dengan mengambil kira kebolehlanjutan dan skalabiliti, aplikasi ini berfungsi sebagai asas yang sangat baik untuk projek yang memerlukan pengurusan pengguna dan kawalan akses berasaskan peranan.

Dengan memanfaatkan alatan berkuasa Spring seperti Spring Security, Spring Data JPA dan JavaMailSender, projek ini memastikan amalan terbaik dalam keselamatan, kebolehselenggaraan dan kemudahan integrasi. Sama ada anda sedang membina aplikasi web yang kecil atau sistem perusahaan yang besar, projek ini menyediakan titik permulaan yang praktikal dan tersusun dengan baik untuk mengurus akaun pengguna dengan selamat.


Konfigurasi

Kebergantungan Pom.xml

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>


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

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


Docker

Untuk menjalankan pangkalan data PostgreSQL, buat fail docker-compose.yaml:

services:
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=database
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

Lari:

docker compose up -d

permohonan.sifat

spring.application.name=login_app

spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=admin
spring.datasource.password=admin

spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525


spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8


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

spring.config.import=classpath:env.properties

jwt.public.key=classpath:public.key
jwt.private.key=classpath:private.key


env.properties

spring.mail.username=<Get in your mailtrap account>
spring.mail.password=<Get in your mailtrap account>

Bagaimana untuk mencipta kunci asimetri?

Lihat dalam siaran ini cara menjana kunci asimetri


Struktur Projek

login_app/
├── .mvn/                       # Maven folder (Maven configurations)
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── dev/
│   │   │       └── mspilari/
│   │   │           └── login_app/
│   │   │               ├── configs/           # Security, authentication, and other configurations
│   │   │               ├── domains/           # Main application domains
│   │   │               │   ├── email/         # Email-related logic
│   │   │               │   └── user/          # User-related logic
│   │   │               ├── exceptions/        # Custom exceptions and error handling
│   │   │               └── utils/             # Utilities and helpers
│   │   └── resources/                         # Resources (e.g., configuration files)
│   └── test/                                  # Application tests
├── target/                                    # Build folder generated by Maven
├── .gitattributes                             # Git attributes configuration
├── .gitignore                                 # Git ignore file
├── docker-compose.yaml                        # Docker Compose configuration
├── HELP.md                                    # Project help documentation
├── mvnw                                       # Maven Wrapper script for Linux
├── mvnw.cmd                                   # Maven Wrapper script for Windows
└── pom.xml                                    # Maven configuration file

Ciri-ciri

  • Pendaftaran pengguna dengan pengesahan e-mel dan kata laluan
  • Log masuk dengan pengesahan JWT
  • Pemulihan kata laluan dengan penghantaran pautan e-mel
  • Tetapan semula kata laluan melalui pautan dengan token sementara
  • Pengesahan medan dan pengendalian ralat

Kod

Direktori konfigurasi

BCryptPasswordConfig.java

package dev.mspilari.login_app.configs;

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

@Configuration
public class BCryptPasswordConfig {

    @Bean
    public BCryptPasswordEncoder bPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

Pecahan Kod

  1. @Konfigurasi

    • Anotasi ini memberitahu Spring bahawa kelas mengandungi takrifan kacang.
    • Kelas yang dianotasi dengan @Configuration diproses semasa aplikasi dimulakan dan sebarang kaedah yang dianotasi dengan @Bean akan menambah nilai pulangannya pada konteks aplikasi Spring sebagai kacang terurus.
  2. @Kacang

    • Anotasi @Bean pada kaedah bPasswordEncoder() menunjukkan bahawa kaedah ini mengembalikan objek yang harus didaftarkan sebagai kacang dalam konteks aplikasi Spring.
    • Ini membolehkan objek BCryptPasswordEncoder disuntik di mana sahaja ia diperlukan dalam aplikasi.
  3. BCryptPasswordEncoder

    • Ini ialah kelas utiliti yang disediakan oleh Spring Security untuk pengekodan kata laluan.
    • Ia menggunakan algoritma pencincangan BCrypt, yang dianggap sebagai cara yang kukuh dan selamat untuk mencincang kata laluan. Algoritma secara automatik menambah "garam" pada kata laluan sebelum pencincangan, menjadikannya tahan terhadap serangan kamus dan serangan jadual pelangi.
  4. Kaedah bPasswordEncoder()

    • Apabila kaedah ini dipanggil oleh rangka kerja Spring, ia mencipta tika baharu BCryptPasswordEncoder dan menjadikannya tersedia dalam konteks aplikasi.
    • Kelas lain dalam aplikasi kemudiannya boleh mengautomasikan kacang ini untuk mengekod atau memadankan kata laluan.

JwtConfig.java

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>


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

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Pecahan Kod

1. Anotasi Peringkat Kelas

services:
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=database
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

  • Menunjukkan ini ialah kelas konfigurasi Spring di mana kacang (komponen diurus Spring) ditakrifkan.
  • Kacang yang ditakrifkan di sini akan tersedia dalam Konteks Aplikasi Musim Bunga untuk suntikan kebergantungan.

2. Menyuntik Kunci RSA daripada Konfigurasi

docker compose up -d
  • @Value digunakan untuk menyuntik kunci awam dan kunci peribadi daripada fail sifat aplikasi (cth., application.yml atau application.properties).
  • Kunci ini dijangka berada dalam sifat sebagai:
spring.application.name=login_app

spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=admin
spring.datasource.password=admin

spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525


spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8


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

spring.config.import=classpath:env.properties

jwt.public.key=classpath:public.key
jwt.private.key=classpath:private.key


3. Kacang Pengekod JWT

spring.mail.username=<Get in your mailtrap account>
spring.mail.password=<Get in your mailtrap account>
  • Tujuan: Mencipta kacang untuk pengekodan (menjana) token JWT.
  • Langkah:
    1. Bina Kunci RSA:
      • RSAKey.Builder mencipta perwakilan JWK (JSON Web Key) bagi pasangan kunci RSA awam/swasta.
    2. Buat Set JWK:
      • ImmutableJWKSet menyimpan kunci dalam satu set. Set ini digunakan oleh perpustakaan Nimbus JOSE untuk menandatangani token.
    3. NimbusJwtEncoder:
      • Pengekod ini menggunakan ImmutableJWKSet untuk mengekod dan menandatangani token menggunakan kunci persendirian.

4. Kacang Dekoder JWT

login_app/
├── .mvn/                       # Maven folder (Maven configurations)
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── dev/
│   │   │       └── mspilari/
│   │   │           └── login_app/
│   │   │               ├── configs/           # Security, authentication, and other configurations
│   │   │               ├── domains/           # Main application domains
│   │   │               │   ├── email/         # Email-related logic
│   │   │               │   └── user/          # User-related logic
│   │   │               ├── exceptions/        # Custom exceptions and error handling
│   │   │               └── utils/             # Utilities and helpers
│   │   └── resources/                         # Resources (e.g., configuration files)
│   └── test/                                  # Application tests
├── target/                                    # Build folder generated by Maven
├── .gitattributes                             # Git attributes configuration
├── .gitignore                                 # Git ignore file
├── docker-compose.yaml                        # Docker Compose configuration
├── HELP.md                                    # Project help documentation
├── mvnw                                       # Maven Wrapper script for Linux
├── mvnw.cmd                                   # Maven Wrapper script for Windows
└── pom.xml                                    # Maven configuration file
  • Tujuan: Mencipta kacang untuk penyahkodan dan mengesahkan token JWT.
  • Langkah:
    1. Pengesahan Kunci Awam:
      • NimbusJwtDecoder.withPublicKey() dikonfigurasikan dengan kunci awam RSA. Ia mengesahkan tandatangan token.
    2. Bina Penyahkod:
      • Kaedah build() mencipta tika penyahkod.

Cara Pengekodan dan Penyahkodan JWT Berfungsi

  1. Pengekodan JWT (Penjanaan Token):

    • Kacang JwtEncoder digunakan untuk mencipta token JWT yang ditandatangani. Token ini biasanya mengandungi maklumat pengguna (cth., nama pengguna, peranan, dll.) sebagai tuntutan dan ditandatangani menggunakan kunci peribadi RSA.
    • Contoh:
    package dev.mspilari.login_app.configs;
    
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    
    @Configuration
    public class BCryptPasswordConfig {
    
        @Bean
        public BCryptPasswordEncoder bPasswordEncoder() {
            return new BCryptPasswordEncoder();
        }
    }
    
    
  2. Penyahkodan JWT (Pengesahan Token):

    • Kacang JwtDecoder digunakan untuk menyahkod dan mengesahkan token menggunakan kunci awam RSA. Ini memastikan token:
      • Telah dikeluarkan oleh pelayan (pengesahan tandatangan).
      • Belum diusik.
    • Contoh:
    package dev.mspilari.login_app.configs;
    
    import java.security.interfaces.RSAPrivateKey;
    import java.security.interfaces.RSAPublicKey;
    
    import org.springframework.beans.factory.annotation.Value;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.oauth2.jwt.JwtDecoder;
    import org.springframework.security.oauth2.jwt.JwtEncoder;
    import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
    import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;
    
    import com.nimbusds.jose.jwk.JWKSet;
    import com.nimbusds.jose.jwk.RSAKey;
    import com.nimbusds.jose.jwk.source.ImmutableJWKSet;
    
    @Configuration
    public class JwtConfig {
        @Value("${jwt.public.key}")
        private RSAPublicKey publicKey;
    
        @Value("${jwt.private.key}")
        private RSAPrivateKey privateKey;
    
        @Bean
        public JwtEncoder jwtEncoder() {
            var jwk = new RSAKey.Builder(this.publicKey).privateKey(this.privateKey).build();
    
            var jwks = new ImmutableJWKSet<>(new JWKSet(jwk));
    
            return new NimbusJwtEncoder(jwks);
        }
    
        @Bean
        public JwtDecoder jwtDecoder() {
            return NimbusJwtDecoder.withPublicKey(this.publicKey).build();
        }
    }
    

SecurityConfig.java

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>


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

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

1. Anotasi Peringkat Kelas

services:
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=database
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:

  • @Configuration: Menandai kelas ini sebagai konfigurasi Spring yang mentakrifkan kacang.
  • @EnableWebSecurity: Mendayakan ciri keselamatan web Spring Security.
  • @EnableMethodSecurity: Mengaktifkan anotasi keselamatan peringkat kaedah seperti @PreAuthorize atau @Secured. Ini membolehkan anda mengawal akses kepada kaedah tertentu dalam aplikasi anda berdasarkan peranan, kebenaran atau syarat.

2. SecurityFilterChain Bean

docker compose up -d
  • Mentakrifkan rantaian penapis keselamatan untuk aplikasi. Rantaian penapis ialah jujukan penapis keselamatan yang digunakan pada permintaan HTTP masuk.

3. Perlindungan CSRF

spring.application.name=login_app

spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=admin
spring.datasource.password=admin

spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525


spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8


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

spring.config.import=classpath:env.properties

jwt.public.key=classpath:public.key
jwt.private.key=classpath:private.key

  • Perlindungan CSRF (Pemalsuan Permintaan Merentas Tapak) dilumpuhkan.
    • Perlindungan CSRF selalunya tidak diperlukan untuk API tanpa kewarganegaraan, kerana token (seperti JWT) sudah menyediakan cara untuk menghalang permintaan yang tidak dibenarkan.
    • Melumpuhkannya memudahkan konfigurasi keselamatan untuk API berasaskan JWT ini.

4. Peraturan Kebenaran

spring.mail.username=<Get in your mailtrap account>
spring.mail.password=<Get in your mailtrap account>
  • Konfigurasikan titik akhir yang memerlukan pengesahan:
    • Izinkan Semua:
    • POST permintaan ke titik akhir seperti /user/register, /user/login, /user/redeem-password dan /user/reset-password terbuka kepada semua orang (tiada pengesahan diperlukan).
    • Titik akhir ini mungkin digunakan untuk pendaftaran pengguna, log masuk dan pemulihan/set semula kata laluan, yang biasanya boleh diakses tanpa log masuk.
    • Sahkan Permintaan Lain:
    • Semua titik akhir lain (sebarangPermintaan) memerlukan pengesahan.

5. Pengesahan JWT

login_app/
├── .mvn/                       # Maven folder (Maven configurations)
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── dev/
│   │   │       └── mspilari/
│   │   │           └── login_app/
│   │   │               ├── configs/           # Security, authentication, and other configurations
│   │   │               ├── domains/           # Main application domains
│   │   │               │   ├── email/         # Email-related logic
│   │   │               │   └── user/          # User-related logic
│   │   │               ├── exceptions/        # Custom exceptions and error handling
│   │   │               └── utils/             # Utilities and helpers
│   │   └── resources/                         # Resources (e.g., configuration files)
│   └── test/                                  # Application tests
├── target/                                    # Build folder generated by Maven
├── .gitattributes                             # Git attributes configuration
├── .gitignore                                 # Git ignore file
├── docker-compose.yaml                        # Docker Compose configuration
├── HELP.md                                    # Project help documentation
├── mvnw                                       # Maven Wrapper script for Linux
├── mvnw.cmd                                   # Maven Wrapper script for Windows
└── pom.xml                                    # Maven configuration file
  • Mengkonfigurasikan aplikasi sebagai pelayan sumber OAuth 2.0 yang mengesahkan permintaan menggunakan token JWT.
  • Penyahkod JWT:
    • Kacang JwtDecoder (disediakan oleh JwtConfig) digunakan untuk mengesahkan token JWT masuk untuk permintaan untuk mendapatkan titik akhir.

Cara Ini Berfungsi

  1. CSRF Dilumpuhkan: Memandangkan ini adalah API yang bergantung pada pengesahan JWT tanpa kewarganegaraan, melumpuhkan CSRF adalah amalan biasa.
  2. Peraturan Kebenaran:
    • Pengguna yang tidak disahkan hanya boleh mengakses titik akhir yang dibenarkan secara jelas (cth., /user/register atau /user/login).
    • Sebarang permintaan lain memerlukan token JWT yang sah.
  3. Pengesahan JWT:
    • Spring Security mengeluarkan pengepala Kebenaran secara automatik daripada permintaan masuk.
    • Jika pengepala mengandungi token JWT yang sah, permintaan itu disahkan dan konteks pengguna ditetapkan.
    • Jika token tidak sah atau tiada, permintaan itu ditolak.

Direktori domain

Direktori e-mel

Direktori perkhidmatan
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-oauth2-resource-server</artifactId>
        </dependency>


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

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

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

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>

        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>


Direktori pengguna

Direktori pengawal
services:
  postgres:
    image: postgres:latest
    ports:
      - "5432:5432"
    environment:
      - POSTGRES_DB=database
      - POSTGRES_USER=admin
      - POSTGRES_PASSWORD=admin
    volumes:
      - postgres_data:/var/lib/postgresql/data

volumes:
  postgres_data:


direktori DTO

UserDto.java

docker compose up -d

UserRedeemPasswordDto.java

spring.application.name=login_app

spring.datasource.url=jdbc:postgresql://localhost:5432/database
spring.datasource.username=admin
spring.datasource.password=admin

spring.mail.host=sandbox.smtp.mailtrap.io
spring.mail.port=2525


spring.mail.properties.mail.smtp.auth=true
spring.mail.properties.mail.smtp.starttls.enable=true
spring.mail.properties.mail.smtp.starttls.required=true
spring.mail.default-encoding=UTF-8


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

spring.config.import=classpath:env.properties

jwt.public.key=classpath:public.key
jwt.private.key=classpath:private.key


UserResetPasswordDto.java

spring.mail.username=<Get in your mailtrap account>
spring.mail.password=<Get in your mailtrap account>

Direktori entiti

UserEntity.java

login_app/
├── .mvn/                       # Maven folder (Maven configurations)
├── src/
│   ├── main/
│   │   ├── java/
│   │   │   └── dev/
│   │   │       └── mspilari/
│   │   │           └── login_app/
│   │   │               ├── configs/           # Security, authentication, and other configurations
│   │   │               ├── domains/           # Main application domains
│   │   │               │   ├── email/         # Email-related logic
│   │   │               │   └── user/          # User-related logic
│   │   │               ├── exceptions/        # Custom exceptions and error handling
│   │   │               └── utils/             # Utilities and helpers
│   │   └── resources/                         # Resources (e.g., configuration files)
│   └── test/                                  # Application tests
├── target/                                    # Build folder generated by Maven
├── .gitattributes                             # Git attributes configuration
├── .gitignore                                 # Git ignore file
├── docker-compose.yaml                        # Docker Compose configuration
├── HELP.md                                    # Project help documentation
├── mvnw                                       # Maven Wrapper script for Linux
├── mvnw.cmd                                   # Maven Wrapper script for Windows
└── pom.xml                                    # Maven configuration file

Direktori Enums

Role.java

package dev.mspilari.login_app.configs;

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

@Configuration
public class BCryptPasswordConfig {

    @Bean
    public BCryptPasswordEncoder bPasswordEncoder() {
        return new BCryptPasswordEncoder();
    }
}


Direktori repositori

UserRepository.java

package dev.mspilari.login_app.configs;

import java.security.interfaces.RSAPrivateKey;
import java.security.interfaces.RSAPublicKey;

import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.oauth2.jwt.JwtDecoder;
import org.springframework.security.oauth2.jwt.JwtEncoder;
import org.springframework.security.oauth2.jwt.NimbusJwtDecoder;
import org.springframework.security.oauth2.jwt.NimbusJwtEncoder;

import com.nimbusds.jose.jwk.JWKSet;
import com.nimbusds.jose.jwk.RSAKey;
import com.nimbusds.jose.jwk.source.ImmutableJWKSet;

@Configuration
public class JwtConfig {
    @Value("${jwt.public.key}")
    private RSAPublicKey publicKey;

    @Value("${jwt.private.key}")
    private RSAPrivateKey privateKey;

    @Bean
    public JwtEncoder jwtEncoder() {
        var jwk = new RSAKey.Builder(this.publicKey).privateKey(this.privateKey).build();

        var jwks = new ImmutableJWKSet<>(new JWKSet(jwk));

        return new NimbusJwtEncoder(jwks);
    }

    @Bean
    public JwtDecoder jwtDecoder() {
        return NimbusJwtDecoder.withPublicKey(this.publicKey).build();
    }
}

Direktori perkhidmatan

UserService.java

@Configuration

Direktori pengecualian

GlobalException.java

@Value("${jwt.public.key}")
private RSAPublicKey publicKey;

@Value("${jwt.private.key}")
private RSAPrivateKey privateKey;

Direktori utiliti

JwtActions.java

  jwt.public.key=<your-public-key>
  jwt.private.key=<your-private-key>

Kesimpulan

Dalam projek ini, kami berjaya melaksanakan sistem pengesahan pengguna yang selamat dan kaya dengan ciri menggunakan Spring Boot. Di luar fungsi teras seperti pendaftaran pengguna, log masuk, dan pengesahan berasaskan JWT, aplikasi itu juga menggabungkan sistem pemulihan kata laluan. Pengguna boleh menetapkan semula kata laluan mereka melalui pautan e-mel, memastikan proses pemulihan yang lancar dan selamat.

Untuk memudahkan pemulihan kata laluan berasaskan e-mel, kami menyepadukan E-mel Musim Bunga dengan Mailtrap, perkhidmatan ujian e-mel yang selamat dan cekap. Ini membolehkan aplikasi menghantar pautan tetapan semula kata laluan dengan token sementara sambil memastikan bahawa e-mel dihantar dengan selamat dan diuji dalam persekitaran terkawal. Persediaan ini menunjukkan cara mengendalikan aliran kerja sensitif seperti pemulihan kata laluan tanpa mendedahkan pengguna sebenar kepada isu yang berpotensi semasa pembangunan dan ujian.

Gabungan amalan pengesahan selamat, pengurusan kata laluan yang mantap dan penyepaduan e-mel yang lancar menjadikan aplikasi ini asas yang boleh dipercayai untuk mana-mana sistem web moden. Pembangun boleh menyesuaikan amalan ini untuk memenuhi keperluan khusus mereka, memastikan kebolehskalaan dan kepercayaan pengguna. Dengan memanfaatkan amalan dan alatan terbaik seperti Spring Security dan Mailtrap, kami telah menunjukkan cara membina aplikasi yang selamat dan memfokuskan pengguna dengan mudah.


? Rujukan

  • Keselamatan Musim Bunga
  • MailTrap
  • E-mel Musim Bunga

? Repositori Projek

  • Repositori Projek di Github

? Bercakap dengan saya

  • LinkedIn
  • Github
  • Portfolio

Atas ialah kandungan terperinci Sistem log masuk dengan token JWT dan kata laluan tetapan semula e-mel. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn