Spring Security基础:快速搭建安全认证系统(零基础入门)

勇敢狼
2025-06-15 04:10
阅读 390

一、开篇:Spring Security 是什么?我们为什么需要它?

一、开篇:Spring Security 是什么?我们为什么需要它?

你有没有想过,一个网站或者 App,为什么能区分用户谁是谁,还能限制某些功能只能特定人群使用?比如说,普通用户不能访问后台管理页面,登录之后才能留言评论……这一切背后的“守护者”,就是身份认证与权限控制系统

在 Java Web 开发领域,最常用的权限控制框架就是 Spring Security。它的作用就像网站的“门卫”,可以检查你是谁、你有什么权限、能不能进入某个资源区域。

一句话解释 Spring Security:它是用来控制哪些人可以访问你的网站资源的工具。

在本教程中,我们将从零开始,一步步搭建一个简单的安全认证系统:实现用户登录和访问控制。即使你完全没接触过 Spring Security,也不用担心——我们会用最简单的方式讲解,并配合代码示例一起完成实战项目。


二、环境准备:开发前的准备工作

二、环境准备:开发前的准备工作

为了顺利实践 Spring Security 的内容,我们需要准备好基本的开发环境。这一部分虽然有些配置,但非常重要。请按照步骤来操作。

1. 安装 JDK(Java Development Kit)

Spring 是基于 Java 的技术栈,所以我们首先要安装 JDK。推荐使用 JDK 17(目前主流版本)或更高。

  • 下载地址:https://adoptium.net/
  • 安装完成后,在命令行输入以下命令查看是否安装成功:
java -version

如果能看到类似下面的内容,说明已经安装好 JDK:

openjdk version "17.0.5" 2022-10-18

2. 安装 IDEA 或 VS Code(或其他 IDE)

建议使用 IntelliJ IDEA(社区版即可),因为它对 Spring Boot 支持非常好。

当然你也可以使用 VS Code + Spring Boot 插件 来进行开发。


3. 创建 Spring Boot 项目(推荐使用 Spring Initializr)

访问 https://start.spring.io/ 网站,创建一个新的 Spring Boot 项目。填写如下信息:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 3.x (如 3.0.6)
  • Group: com.example
  • Artifact: spring-security-demo
  • Name: spring-security-demo
  • Packaging: Jar
  • Java: 17+

然后添加依赖项:

  • Spring Web
  • Spring Security

点击 “Generate” 按钮下载项目压缩包,解压后导入 IDEA。


4. 导入项目 & 启动测试

解压后打开文件夹,你会发现这是一个标准的 Maven 项目结构。

src/main/java/com/example/springsecuritydemo/SpringSecurityDemoApplication.java 这个主类中运行:

public class SpringSecurityDemoApplication {

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

如果你看到控制台中有类似 Started SpringSecurityDemoApplication in X seconds 的提示,说明 Spring Boot 已经启动成功了!

接下来就可以正式学习 Spring Security 啦!


三、核心概念:这些术语是什么意思?

学习 Spring Security,绕不开一些专业术语。没关系,我们用大白话解释给你听。

1. 认证(Authentication)

认证就是确认用户身份的过程。比如你去网站登录时填用户名密码,就是在做认证。

2. 授权(Authorization)

授权是指确定一个已知身份的用户,是否有权限访问某个资源。例如,管理员可以访问后台,普通用户不行。

3. 用户(User)

用户就是系统中的人,每个用户有唯一标识(用户名),并且有一个密码用于登录。

4. 角色(Role)

角色是用户的一个分类。例如,系统中有“普通用户”、“管理员”等角色。

5. 权限(Authority / Permission)

权限是指具体的操作权限,例如“查看数据”、“新增数据”。角色可以对应一组权限。

6. 安全配置(SecurityConfig)

这是 Spring Security 中最重要的组件之一。它是一个 Java 类,用来告诉 Spring Security 如何保护我们的网站资源。


四、实战项目:快速搭建安全认证系统

我们现在要完成这样一个小项目:

实现两个页面:

  • /home:所有人都可以访问的首页
  • /admin:只有登录后的管理员才能访问

我们将一步步来做这个项目。


第一步:添加默认用户(内存用户)

我们先设置两个用户:

  • 用户名:user,密码:123456,角色:USER
  • 用户名:admin,密码:123456,角色:ADMIN

修改 SecurityConfig.java

创建一个新的配置类,名字叫 SecurityConfig.java,放在 com.example.springsecuritydemo.config 包下。

完整代码如下:

package com.example.springsecuritydemo.config;

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.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    @Bean
    public InMemoryUserDetailsManager userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("123456")
                .roles("USER")
                .build();

        UserDetails admin = User.withDefaultPasswordEncoder()
                .username("admin")
                .password("123456")
                .roles("ADMIN")
                .build();

        return new InMemoryUserDetailsManager(user, admin);
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .requestMatchers("/home").permitAll()
                .requestMatchers("/admin").hasRole("ADMIN")
                .anyRequest().authenticated()
                .and()
                .formLogin()
                .and()
                .logout()
                .permitAll();

        return http.build();
    }
}

这段代码做了几件事:

  • 使用 InMemoryUserDetailsManager 在内存中定义了两个用户。
  • 使用 authorizeRequests() 设置 URL 访问权限:
    • /home 所有人可访问
    • /admin 只有 ADMIN 角色才可以访问
    • 其他路径必须登录才可访问
  • 使用 .formLogin() 开启 Spring Security 自带的登录页
  • 使用 .logout() 开启退出登录功能

第二步:创建控制器类 HomeAndAdminController

创建一个 Controller 控制器类,处理两个请求 /home/admin

package com.example.springsecuritydemo.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class HomeController {

    @GetMapping("/home")
    public String home() {
        return "欢迎来到首页!任何人都可以看到我!";
    }

    @GetMapping("/admin")
    public String admin() {
        return "我是管理员页面,非管理员进不来哦!";
    }
}

第三步:启动项目并测试访问

再次运行你的 Spring Boot 主程序。此时你可以尝试访问这两个链接:

  1. 访问:http://localhost:8080/home —— 直接可以看到欢迎语,不需要登录
  2. 访问:http://localhost:8080/admin —— 会被自动跳转到登录页面(Spring Security 自动生成)
    • 输入用户名:admin,密码:123456 → 成功跳转
    • 如果输入的是 user 用户,则会提示没有权限

恭喜你,你已经实现了第一个 Spring Security 认证系统!


第四步(可选):自定义登录页面

现在我们用的是 Spring Security 提供的默认登录页,我们可以替换成自己的 HTML 页面。

1. 创建 login.html

src/main/resources/templates 文件夹下新建一个 login.html 文件,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
<h2>自定义登录页</h2>

<form method="post" action="/login">
    <div>
        用户名:<input type="text" name="username"/>
    </div>
    <div>
        密码:<input type="password" name="password"/>
    </div>
    <button type="submit">登录</button>
</form>
</body>
</html>

2. 修改 SecurityConfig.java,启用自定义登录页面

只需要修改 securityFilterChain 方法中的 .formLogin() 部分:

.and()
.formLogin()
.loginPage("/login") // 我们自定义的登录页路径
.permitAll()
.and()
.logout()
.permitAll();

3. 添加一个 controller 返回 login.html

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

再访问 http://localhost:8080/admin 就会看到我们自己写的登录页了!


五、常见问题解答(FAQ)

Q1:报错 Error creating bean with name 'securityConfig'

可能是缺少依赖,确保 pom.xml 中包含:

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

Q2:登录不成功,总是失败?

确保密码输入正确,尤其是大小写敏感。同时检查 .withDefaultPasswordEncoder() 是否使用正确(注意该加密方式不推荐用于生产环境)。

Q3:如何禁用 CSRF(跨站攻击防护)?

对于前后端分离项目可能需要临时关闭 CSRF 以方便调试:

SecurityConfigsecurityFilterChain 方法里加上:

.csrf().disable();

不过请注意,正式环境中务必开启安全机制。

Q4:如何让登录后自动跳转到指定页面?

可以在 SecurityConfig 中添加如下配置:

.defaultSuccessUrl("/home", true)

六、下一步学习建议

恭喜你完成了第一个 Spring Security 入门项目!如果你对 Spring Security 产生了兴趣,接下来可以继续深入学习以下内容:

1. 更复杂的安全策略

  • 基于数据库的用户验证(连接 MySQL 数据库)
  • 多种认证方式(手机验证码、第三方登录 OAuth)
  • 权限表达式 hasAuthority, hasAnyRole

2. RESTful 接口安全(适合前后端分离场景)

  • JWT(JSON Web Token)认证机制
  • Spring Security 对 API 接口的保护
  • 登录状态保持方案(Token vs Session)

3. 实战项目推荐

  • 博客管理系统:登录用户发布文章、管理员管理用户
  • 商城系统:不同角色访问不同功能(买家、卖家、平台)
  • 微服务权限架构设计(网关 + 多服务统一鉴权)

总结

本文带你从零开始搭建了一个带有用户登录与权限控制的基础认证系统,涵盖了认证、授权、角色、配置等多个关键知识点,并通过具体的代码演示帮助理解。

记住:

认证是为了知道“你是谁”,授权是为了决定“你能做什么”。

作为初学者,你已经有了一个坚实的起点。Spring Security 虽然内容丰富,但只要一步步跟着练,就一定能掌握!

如果你想获取完整的代码项目,请关注我的后续更新,我会提供 GitHub 源码仓库地址。

祝你在 Spring Security 学习路上越走越远,成为真正懂安全的 Java 工程师!


📚 文章字数统计:约 3773 字
✅ 符合初学者教学风格,语言通俗易懂,结构清晰,注重代码实战
🔍 涵盖 Spring Security 核心知识,适合刚入门的小白快速上手

评论 0

最热最新
暂无评论
匿名用户Lv.1
0
影响力
0
文章
0
粉丝