最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot整合Spring Security實現(xiàn)基礎(chǔ)認證與授權(quán)

 更新時間:2026年04月24日 09:05:09   作者:希望永不加班  
在后端開發(fā)領(lǐng)域,認證(Authentication)?和授權(quán)(Authorization)?是系統(tǒng)安全的核心基石,Spring Security 作為 Spring 生態(tài)官方推薦的安全框架,是Java 后端安全開發(fā)的首選方案,本文給大家介紹了SpringBoot整合Spring Security實現(xiàn)基礎(chǔ)認證與授權(quán)

在后端開發(fā)領(lǐng)域,認證(Authentication) 和授權(quán)(Authorization) 是系統(tǒng)安全的核心基石。簡單來說:認證是確認「你是誰」,授權(quán)是決定「你能做什么」。

Spring Security 作為 Spring 生態(tài)官方推薦的安全框架,憑借高度模塊化、可擴展、無縫整合 SpringBoot 等特性,成為 Java 后端安全開發(fā)的首選方案。

一、前置知識與環(huán)境說明

1.1 核心概念

1. 認證(Authentication)
驗證用戶身份是否合法,比如輸入賬號密碼登錄、短信驗證碼登錄,都屬于認證流程。

2. 授權(quán)(Authorization)
認證通過后,根據(jù)用戶的角色/權(quán)限,控制用戶能訪問哪些接口、頁面,比如管理員能訪問所有接口,普通用戶只能訪問個人接口。

3. Spring Security
基于 Spring AOP 和 Servlet 過濾器實現(xiàn)的安全框架,默認提供了表單登錄、注銷、會話管理、csrf 防護、權(quán)限控制等全套安全能力。

1.2 開發(fā)環(huán)境

  • JDK 8+
  • SpringBoot 2.7.x(穩(wěn)定版,兼容絕大多數(shù)企業(yè)項目)
  • Maven 3.6+
  • IDEA 開發(fā)工具
  • Lombok(簡化代碼)

二、項目初始化與依賴引入

2.1 創(chuàng)建 SpringBoot 項目

打開 IDEA,創(chuàng)建一個標準的 SpringBoot 項目,項目名稱:springboot-security-demo。

2.2 核心依賴(pom.xml)

直接復(fù)制以下依賴,無需額外版本號,SpringBoot 自動管理版本兼容:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.15</version>
        <relativePath/>
    </parent>
    <groupId>com.example</groupId>
    <artifactId>springboot-security-demo</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot-security-demo</name>
    <properties>
        <java.version>1.8</java.version>
    </properties>
    <dependencies>
        <!-- SpringBoot Web 核心依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!-- Spring Security 安全框架 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!-- Lombok 簡化代碼 -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <!-- 測試依賴 -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <excludes>
                        <exclude>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                        </exclude>
                    </excludes>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>

2.3 啟動項目,體驗?zāi)J安全機制

直接啟動 SpringBoot 項目,控制臺會打印一段默認密碼

Using generated security password: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

默認用戶名:user
默認密碼:控制臺打印的隨機字符串

訪問測試接口:http://localhost:8080
會自動跳轉(zhuǎn)到 Spring Security 提供的默認登錄頁面,輸入賬號密碼即可登錄成功。

這就是 Spring Security 的自動配置機制,零代碼實現(xiàn)基礎(chǔ)登錄保護,但實際項目中,我們必須自定義登錄邏輯、用戶信息、權(quán)限規(guī)則。

三、Spring Security 核心架構(gòu)理解

在動手寫代碼前,先搞懂核心組件,后續(xù)配置會一目了然:

1. SecurityContextHolder
安全上下文持有者,存儲當(dāng)前登錄用戶的信息(Authentication 對象)。

2. Authentication
認證對象,包含用戶身份信息、權(quán)限信息、認證狀態(tài)。

3. UserDetailsService
核心接口,用于加載用戶信息(我們必須實現(xiàn)它,自定義查詢用戶邏輯)。

4. PasswordEncoder
密碼加密器,Spring Security 強制要求密碼加密,不能明文存儲。

5. SecurityFilterChain
安全過濾器鏈,所有認證、授權(quán)、防護邏輯都通過過濾器鏈執(zhí)行。

6. @PreAuthorize
權(quán)限注解,用于控制方法/接口的訪問權(quán)限。

四、內(nèi)存用戶認證

第一步,我們先使用內(nèi)存用戶實現(xiàn)登錄認證,不連接數(shù)據(jù)庫,快速理解配置邏輯。

4.1 創(chuàng)建 Security 配置類

創(chuàng)建配置類:com.example.config.SecurityConfig

package com.example.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
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.InMemoryUserDetailsManager;
/**
 * Spring Security 核心配置類
 * @EnableWebSecurity 開啟 Spring Security  web 安全支持
 */
@Configuration
@EnableWebSecurity
public class SecurityConfig {
    /**
     * 密碼加密器
     * 推薦使用 BCrypt 算法,自動加鹽,不可逆加密
     */
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    /**
     * 內(nèi)存用戶信息管理
     * 定義兩個用戶:admin(管理員)、user(普通用戶)
     */
    @Bean
    public UserDetailsService userDetailsService() {
        // 管理員用戶
        UserDetails admin = User.builder()
                .username("admin")
                .password(passwordEncoder().encode("123456")) // 密碼加密
                .roles("ADMIN") // 角色
                .build();
        // 普通用戶
        UserDetails user = User.builder()
                .username("user")
                .password(passwordEncoder().encode("123456"))
                .roles("USER")
                .build();
        // 內(nèi)存存儲用戶信息
        return new InMemoryUserDetailsManager(admin, user);
    }
}

4.2 配置說明

1. @EnableWebSecurity:開啟 Spring Security 安全配置。

2. PasswordEncoder:必須配置,Spring Security 禁止明文密碼,BCrypt 是官方推薦加密方式。

3. UserDetailsService:用戶信息加載接口,這里使用內(nèi)存實現(xiàn)。

4. .roles():為用戶分配角色,用于后續(xù)授權(quán)控制。

4.3 測試登錄

重啟項目,訪問:http://localhost:8080/login

  • 管理員賬號:admin / 123456
  • 普通用戶賬號:user / 123456

登錄成功后,即可訪問所有接口(此時還未做權(quán)限控制)。

五、URL 權(quán)限控制

我們需要對不同接口設(shè)置不同的訪問權(quán)限,比如:

  • 公共接口:所有人可訪問(登錄、首頁、靜態(tài)資源)
  • 用戶接口:僅登錄用戶可訪問
  • 管理員接口:僅 ADMIN 角色可訪問

5.1 修改 SecurityConfig,添加 HttpSecurity 配置

在 SecurityConfig 類中添加以下方法:

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.web.SecurityFilterChain;
/**
 *  SpringBoot 2.7+ 推薦使用 Lambda 風(fēng)格配置
 *  棄用 WebSecurityConfigurerAdapter
 */
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
    http
        // 1. 授權(quán)配置
        .authorizeRequests()
            // 公共接口:無需登錄即可訪問
            .antMatchers("/", "/home", "/login", "/css/**", "/js/**").permitAll()
            // 管理員接口:僅 ADMIN 角色可訪問
            .antMatchers("/admin/**").hasRole("ADMIN")
            // 用戶接口:僅 USER 角色可訪問
            .antMatchers("/user/**").hasRole("USER")
            // 所有其他請求:必須登錄才能訪問
            .anyRequest().authenticated()
        .and()
        // 2. 表單登錄配置
        .formLogin()
            // 自定義登錄頁面(可選)
            .loginPage("/login")
            // 登錄請求處理接口
            .loginProcessingUrl("/doLogin")
            // 登錄成功默認跳轉(zhuǎn)頁面
            .defaultSuccessUrl("/home")
            // 登錄失敗跳轉(zhuǎn)頁面
            .failureUrl("/login?error=true")
            // 允許所有人訪問登錄相關(guān)接口
            .permitAll()
        .and()
        // 3. 登出配置
        .logout()
            // 登出請求接口
            .logoutUrl("/logout")
            // 登出成功跳轉(zhuǎn)頁面
            .logoutSuccessUrl("/login?logout=true")
            // 登出后清除會話
            .invalidateHttpSession(true)
            // 清除認證信息
            .clearAuthentication(true)
            .permitAll()
        .and()
        // 4. 關(guān)閉 CSRF 防護(前后端分離項目建議關(guān)閉)
        .csrf().disable();
    return http.build();
}

5.2 權(quán)限規(guī)則說明

1. permitAll():所有人可訪問,無需登錄。

2. hasRole("角色名"):必須擁有指定角色才能訪問。

3. anyRequest().authenticated():除了上面配置的接口,其余都需要登錄。

4. formLogin():開啟表單登錄,Spring Security 自動生成登錄接口。

5. logout():開啟登出功能,自動清理會話。

5.3 創(chuàng)建測試接口

創(chuàng)建控制器:com.example.controller.TestController

package com.example.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class TestController {
    // 公共接口
    @GetMapping("/home")
    public String home() {
        return "首頁:所有人可訪問";
    }
    // 普通用戶接口
    @GetMapping("/user/info")
    public String userInfo() {
        return "用戶信息:僅 USER 角色可訪問";
    }
    // 管理員接口
    @GetMapping("/admin/info")
    public String adminInfo() {
        return "管理員信息:僅 ADMIN 角色可訪問";
    }
    // 測試接口
    @GetMapping("/test")
    public String test() {
        return "測試接口:僅登錄用戶可訪問";
    }
}

5.4 權(quán)限測試

1. 未登錄:訪問 /admin/info、/user/info、/test 都會自動跳轉(zhuǎn)到登錄頁。

2. 登錄 user 用戶:

  • 可訪問:/home、/user/info/test
  • 不可訪問:/admin/info(403 無權(quán)限)

3. 登錄 admin 用戶:

  • 完美實現(xiàn)基于角色的 URL 權(quán)限控制!

六、注解式權(quán)限控制

除了 URL 配置,Spring Security 還支持方法級注解權(quán)限,更靈活,適合分布式、微服務(wù)項目。

6.1 開啟注解權(quán)限

在啟動類添加 @EnableMethodSecurity(SpringBoot 2.7+)或 @EnableGlobalMethodSecurity(舊版):

package com.example;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.security.config.annotation.method.configuration.EnableMethodSecurity;
// 開啟方法級權(quán)限控制
@EnableMethodSecurity(prePostEnabled = true)
@SpringBootApplication
public class SpringbootSecurityDemoApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootSecurityDemoApplication.class, args);
    }
}

6.2 常用權(quán)限注解

1. @PreAuthorize:方法執(zhí)行前校驗權(quán)限(最常用)

2. @PostAuthorize:方法執(zhí)行后校驗權(quán)限

3. @Secured:舊版角色注解

6.3 實戰(zhàn)使用

@RestController
public class AuthController {
    // 僅 ADMIN 角色可訪問
    @PreAuthorize("hasRole('ADMIN')")
    @GetMapping("/auth/admin")
    public String authAdmin() {
        return "注解權(quán)限:管理員專屬接口";
    }
    // 僅 USER 角色可訪問
    @PreAuthorize("hasRole('USER')")
    @GetMapping("/auth/user")
    public String authUser() {
        return "注解權(quán)限:普通用戶專屬接口";
    }
    // 擁有 ADMIN 或 USER 角色均可訪問
    @PreAuthorize("hasAnyRole('ADMIN','USER')")
    @GetMapping("/auth/common")
    public String authCommon() {
        return "注解權(quán)限:登錄用戶均可訪問";
    }
    // 擁有指定權(quán)限標識(非角色)
    @PreAuthorize("hasAuthority('user:add')")
    @GetMapping("/auth/authority")
    public String authAuthority() {
        return "注解權(quán)限:擁有 user:add 權(quán)限可訪問";
    }
}

注解式權(quán)限代碼侵入性低、靈活度高,是企業(yè)項目主流用法。

七、數(shù)據(jù)庫查詢用戶認證

內(nèi)存用戶僅適合測試,真實項目必須從數(shù)據(jù)庫加載用戶。

核心步驟:

1. 實現(xiàn) UserDetailsService 接口

2. 重寫 loadUserByUsername 方法

3. 從數(shù)據(jù)庫查詢用戶信息+角色權(quán)限

4. 封裝成 UserDetails 對象返回

7.1 引入數(shù)據(jù)庫依賴(可選 MyBatis/MyBatis-Plus/JPA)

這里以 MyBatis-Plus 為例(簡化數(shù)據(jù)庫操作):

<!-- MySQL 驅(qū)動 --> <dependency>     <groupId>mysql</groupId>     <artifactId>mysql-connector-java</artifactId>     <scope>runtime</scope> </dependency> <!-- MyBatis-Plus --> <dependency>     <groupId>com.baomidou</groupId>     <artifactId>mybatis-plus-boot-starter</artifactId>     <version>3.5.3.1</version> </dependency>

7.2 數(shù)據(jù)庫表設(shè)計

-- 用戶表
CREATE TABLE `sys_user` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `username` varchar(50) NOT NULL COMMENT '用戶名',
  `password` varchar(100) NOT NULL COMMENT '密碼(BCrypt加密)',
  `status` int DEFAULT 1 COMMENT '狀態(tài) 0-禁用 1-正常',
  PRIMARY KEY (`id`),
  UNIQUE KEY `username` (`username`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 角色表
CREATE TABLE `sys_role` (
  `id` bigint NOT NULL AUTO_INCREMENT,
  `role_name` varchar(50) NOT NULL COMMENT '角色名稱',
  `role_code` varchar(50) NOT NULL COMMENT '角色編碼 ADMIN/USER',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 用戶角色關(guān)聯(lián)表
CREATE TABLE `sys_user_role` (
  `user_id` bigint NOT NULL,
  `role_id` bigint NOT NULL,
  PRIMARY KEY (`user_id`,`role_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- 插入測試數(shù)據(jù)
INSERT INTO sys_user (username, password, status) VALUES 
('admin', '$2a$10$wJ5i4y9y9Q9m0pOe1x2L3u4S5D6F7G8H9J0K1L2M3N4B5V6C7X8Z9A', 1),
('user', '$2a$10$wJ5i4y9y9Q9m0pOe1x2L3u4S5D6F7G8H9J0K1L2M3N4B5V6C7X8Z9A', 1);
INSERT INTO sys_role (role_name, role_code) VALUES 
('管理員', 'ADMIN'),('普通用戶', 'USER');
INSERT INTO sys_user_role (user_id, role_id) VALUES (1,1),(2,2);

密碼明文:123456,已使用 BCrypt 加密。

7.3 自定義 UserDetails 實現(xiàn)類

Spring Security 默認的 User 類不夠用,我們自定義:

package com.example.entity;
import lombok.Data;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collectors;
/**
 * 自定義用戶詳情,實現(xiàn) UserDetails 接口
 */
@Data
public class SecurityUser implements UserDetails {
    // 用戶ID
    private Long id;
    // 用戶名
    private String username;
    // 密碼
    private String password;
    // 狀態(tài)
    private Integer status;
    // 角色列表
    private List<String> roles;
    /**
     * 獲取權(quán)限/角色集合
     * Spring Security 要求角色必須以 ROLE_ 開頭
     */
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        return roles.stream()
                .map(role -> new SimpleGrantedAuthority("ROLE_" + role))
                .collect(Collectors.toList());
    }
    @Override
    public String getPassword() {
        return this.password;
    }
    @Override
    public String getUsername() {
        return this.username;
    }
    // 賬戶是否未過期
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
    // 賬戶是否未鎖定
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }
    // 密碼是否未過期
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
    // 賬戶是否可用
    @Override
    public boolean isEnabled() {
        return this.status == 1;
    }
}

7.4 實現(xiàn) UserDetailsService 核心接口

package com.example.service.impl;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.example.entity.SecurityUser;
import com.example.entity.SysUser;
import com.example.service.SysRoleService;
import com.example.service.SysUserService;
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.stereotype.Service;
import java.util.List;
/**
 * 自定義用戶認證服務(wù)
 * 核心:從數(shù)據(jù)庫查詢用戶信息
 */
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
    @Autowired
    private SysUserService userService;
    @Autowired
    private SysRoleService roleService;
    /**
     * 根據(jù)用戶名加載用戶信息
     */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // 1. 根據(jù)用戶名查詢用戶
        SysUser user = userService.getOne(Wrappers.<SysUser>lambdaQuery()
                .eq(SysUser::getUsername, username));
        if (user == null) {
            throw new UsernameNotFoundException("用戶名不存在");
        }
        // 2. 查詢用戶角色
        List<String> roles = roleService.getRolesByUserId(user.getId());
        // 3. 封裝成 SecurityUser 對象返回
        SecurityUser securityUser = new SecurityUser();
        securityUser.setId(user.getId());
        securityUser.setUsername(user.getUsername());
        securityUser.setPassword(user.getPassword());
        securityUser.setStatus(user.getStatus());
        securityUser.setRoles(roles);
        return securityUser;
    }
}

7.5 配置類注入自定義 UserDetailsService

刪除之前的內(nèi)存用戶配置,直接使用我們自定義的服務(wù):

@Configuration
@EnableWebSecurity
public class SecurityConfig {
    @Autowired
    private UserDetailsService userDetailsService;
    @Bean
    public PasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .userDetailsService(userDetailsService) // 注入自定義用戶服務(wù)
            .authorizeRequests()
                .antMatchers("/", "/home", "/login").permitAll()
                .antMatchers("/admin/**").hasRole("ADMIN")
                .antMatchers("/user/**").hasRole("USER")
                .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage("/login")
                .loginProcessingUrl("/doLogin")
                .defaultSuccessUrl("/home")
                .permitAll()
            .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login")
                .permitAll()
            .and()
            .csrf().disable();
        return http.build();
    }
}

至此,企業(yè)級數(shù)據(jù)庫認證配置完成!
登錄邏輯完全基于數(shù)據(jù)庫查詢,支持多角色、賬戶狀態(tài)控制。

八、登錄用戶信息獲取

在業(yè)務(wù)代碼中,我們經(jīng)常需要獲取當(dāng)前登錄用戶信息,Spring Security 提供了便捷工具:

import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class UserInfoController {
    /**
     * 獲取當(dāng)前登錄用戶信息
     */
    @GetMapping("/getUserInfo")
    public String getUserInfo() {
        // 1. 獲取認證對象
        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
        // 2. 判斷是否登錄
        if (authentication == null || !authentication.isAuthenticated()) {
            return "未登錄";
        }
        // 3. 獲取用戶信息
        Object principal = authentication.getPrincipal();
        if (principal instanceof UserDetails) {
            SecurityUser securityUser = (SecurityUser) principal;
            return "當(dāng)前登錄用戶:" + securityUser.getUsername() 
                    + ",角色:" + securityUser.getRoles();
        }
        return "獲取用戶信息失敗";
    }
}

九、異常處理:401 未認證 / 403 無權(quán)限

Spring Security 默認異常頁面不友好,我們可以自定義異常處理:

package com.example.config;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.web.AuthenticationEntryPoint;
import org.springframework.security.web.access.AccessDeniedHandler;
import javax.servlet.http.HttpServletResponse;
import java.util.HashMap;
import java.util.Map;
/**
 * 自定義安全異常處理
 */
@Configuration
public class SecurityExceptionConfig {
    /**
     * 401 未登錄處理
     */
    @Bean
    public AuthenticationEntryPoint authenticationEntryPoint() {
        return (request, response, authException) -> {
            response.setContentType("application/json;charset=utf-8");
            response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
            Map<String, Object> result = new HashMap<>();
            result.put("code", 401);
            result.put("msg", "未登錄,請先登錄");
            new ObjectMapper().writeValue(response.getWriter(), result);
        };
    }
    /**
     * 403 無權(quán)限處理
     */
    @Bean
    public AccessDeniedHandler accessDeniedHandler() {
        return (request, response, accessDeniedException) -> {
            response.setContentType("application/json;charset=utf-8");
            response.setStatus(HttpServletResponse.SC_FORBIDDEN);
            Map<String, Object> result = new HashMap<>();
            result.put("code", 403);
            result.put("msg", "無權(quán)限訪問該資源");
            new ObjectMapper().writeValue(response.getWriter(), result);
        };
    }
}

在 SecurityConfig 中注入:

http.exceptionHandling()
    .authenticationEntryPoint(authenticationEntryPoint)
    .accessDeniedHandler(accessDeniedHandler);

十、Spring Security 核心知識點總結(jié)

1. 兩大核心:認證(登錄)+ 授權(quán)(權(quán)限)

2. 核心接口:UserDetailsService(加載用戶)、PasswordEncoder(密碼加密)

3. 兩種權(quán)限控制:URL 配置 + 方法注解

4. 密碼必須加密:BCrypt 算法是最佳實踐

5. 前后端分離:關(guān)閉 CSRF,使用 Token 認證(下篇文章講解)

6. 異常統(tǒng)一處理:401 未登錄、403 無權(quán)限

結(jié)語

Spring Security 是 Java 后端必備安全框架,掌握基礎(chǔ)認證與授權(quán),足以應(yīng)對絕大多數(shù)企業(yè)項目的安全需求。

如果文章對你有幫助,歡迎點贊、在看、轉(zhuǎn)發(fā),你的支持是我持續(xù)更新的動力!

有任何問題,歡迎在評論區(qū)留言交流~

  • 可訪問所有接口。

1. @PreAuthorize:方法執(zhí)行前校驗權(quán)限(最常用)

2. @PostAuthorize:方法執(zhí)行后校驗權(quán)限

3. @Secured:舊版角色注解

1. 實現(xiàn) UserDetailsService 接口

2. 重寫 loadUserByUsername 方法

3. 從數(shù)據(jù)庫查詢用戶信息+角色權(quán)限

4. 封裝成 UserDetails 對象返回

1. 兩大核心:認證(登錄)+ 授權(quán)(權(quán)限)

2. 核心接口:UserDetailsService(加載用戶)、PasswordEncoder(密碼加密)

3. 兩種權(quán)限控制:URL 配置 + 方法注解

4. 密碼必須加密:BCrypt 算法是最佳實踐

5. 前后端分離:關(guān)閉 CSRF,使用 Token 認證(下篇文章講解)

6. 異常統(tǒng)一處理:401 未登錄、403 無權(quán)限

以上就是SpringBoot整合Spring Security實現(xiàn)基礎(chǔ)認證與授權(quán)的詳細內(nèi)容,更多關(guān)于SpringBoot Spring Security認證與授權(quán)的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

最新評論

缙云县| 扎兰屯市| 上高县| 公安县| 富蕴县| 岑巩县| 沈阳市| 环江| 绥阳县| 宁波市| 太仆寺旗| 乌兰县| 横山县| 嘉善县| 开原市| 武隆县| 新巴尔虎右旗| 宜城市| 青河县| 廊坊市| 兴业县| 波密县| 景德镇市| 改则县| 文化| 延津县| 白玉县| 临夏市| 铜山县| 句容市| 萝北县| 右玉县| 高邮市| 长泰县| 安陆市| 台山市| 秭归县| 鄂伦春自治旗| 岑巩县| 东莞市| 临湘市|