深入淺出:使用Java和Spring Security實現認證與授權

自足發表於2024-07-20

深入淺出:使用Java和Spring Security實現認證與授權

大家好,今天我們來聊聊如何使用Java和Spring Security實現認證與授權。Spring Security是一個強大的框架,它提供了全面的安全功能,幫助我們輕鬆實現使用者認證和許可權管理。本文將帶你一步步實現一個簡單的認證與授權系統,並透過程式碼示例讓你更好地理解。

前置條件

在開始之前,請確保你已經安裝了以下工具:

  • JDK 8或更高版本
  • Maven或Gradle
  • IDE(如IntelliJ IDEA或Eclipse)

建立Spring Boot專案

首先,我們需要建立一個Spring Boot專案。你可以使用Spring Initializr來快速生成專案結構。

  1. 開啟Spring Initializr
  2. 選擇專案型別為Maven Project
  3. 選擇Spring Boot版本(建議使用最新穩定版本)
  4. 新增依賴項:
    • Spring Web
    • Spring Security
    • Spring Data JPA
    • H2 Database(用於記憶體資料庫)

生成專案後,將其匯入到你的IDE中。

配置Spring Security

首先,我們需要建立一個配置類來設定Spring Security。建立一個名為SecurityConfig的類,並繼承WebSecurityConfigurerAdapter

package com.example.security;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
            .withUser("user").password(passwordEncoder().encode("password")).roles("USER")
            .and()
            .withUser("admin").password(passwordEncoder().encode("admin")).roles("ADMIN");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasAnyRole("USER", "ADMIN")
                .antMatchers("/").permitAll()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

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

在這個配置類中,我們做了以下幾件事:

  1. 配置了兩個記憶體中的使用者:一個是普通使用者,另一個是管理員。
  2. 配置了URL的訪問許可權:/admin/**路徑只有管理員可以訪問,/user/**路徑普通使用者和管理員都可以訪問,根路徑/對所有人開放。
  3. 配置了表單登入和登出功能。
  4. 使用BCryptPasswordEncoder來加密密碼。

建立控制器

接下來,我們建立一個控制器來處理不同的URL請求。建立一個名為HomeController的類。

package com.example.security;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
public class HomeController {

    @GetMapping("/")
    @ResponseBody
    public String home() {
        return "Welcome to the home page!";
    }

    @GetMapping("/user")
    @ResponseBody
    public String user() {
        return "Welcome to the user page!";
    }

    @GetMapping("/admin")
    @ResponseBody
    public String admin() {
        return "Welcome to the admin page!";
    }

    @GetMapping("/login")
    public String login() {
        return "login";
    }
}

在這個控制器中,我們定義了四個方法來處理不同的URL請求。每個方法返回一個簡單的字串,表示不同的頁面內容。

建立登入頁面

我們還需要建立一個簡單的登入頁面。建立一個名為login.html的檔案,並放在src/main/resources/templates目錄下。

<!DOCTYPE html>
<html>
<head>
    <title>Login</title>
</head>
<body>
    <h2>Login</h2>
    <form method="post" action="/login">
        <div>
            <label>Username:</label>
            <input type="text" name="username"/>
        </div>
        <div>
            <label>Password:</label>
            <input type="password" name="password"/>
        </div>
        <div>
            <button type="submit">Login</button>
        </div>
    </form>
</body>
</html>

這個簡單的HTML表單將使用者的使用者名稱和密碼提交到/login路徑,Spring Security會自動處理這個請求。

執行專案

現在,我們已經完成了所有的配置和程式碼編寫。執行專案,開啟瀏覽器,訪問http://localhost:8080

你會看到一個歡迎頁面。嘗試訪問/user/admin路徑,你會被重定向到登入頁面。使用配置中的使用者名稱和密碼進行登入,你將能夠訪問相應的頁面。

總結

透過本文,我們學習瞭如何使用Java和Spring Security實現一個簡單的認證與授權系統。我們配置了記憶體中的使用者,設定了不同URL的訪問許可權,並建立了一個簡單的登入頁面。希望這篇文章對你有所幫助,如果你有任何問題或建議,歡迎在評論區留言。

感謝你的閱讀,我們下次再見!

百萬大學生都在用的AI寫論文工具,篇篇無重複👉: AI寫論文

相關文章