Spring Security基础:快速搭建安全认证系统

博古通今
2025-06-19 07:52
阅读 1257

一、开篇:Spring Security是什么?能做什么?

一、开篇:Spring Security是什么?能做什么?

在开发Web应用时,你可能听说过“用户登录”、“权限控制”、“安全防护”等关键词。这些功能对于绝大多数网站或应用程序来说都是必不可少的。

Spring Security 就是这样一个帮助我们快速实现这些功能的工具包。它是一个由Spring官方提供的安全框架,专门用于保护我们的Java Web应用免受未经授权的访问和攻击。

你可以把它想象成一个自动门禁系统:

  • 用户必须刷卡(登录)才能进入(访问页面)
  • 不同级别的员工有不同权限(只能访问指定区域)
  • 入口处有保安(拦截器)负责检查每个人的通行证

简单说,有了Spring Security,我们就不用自己从头造轮子去处理用户权限、密码加密、登录逻辑等问题了。


二、环境准备:开始之前,你需要准备好这些工具

二、环境准备:开始之前,你需要准备好这些工具

在开始写代码之前,我们需要先搭好开发环境。这一部分适合完全没接触过Spring Boot的新手朋友。

1. 安装JDK(Java运行环境)

Spring Security基于Java开发,所以首先需要安装 JDK(Java Development Kit),推荐使用JDK 8或以上版本。

java -version

如果看到类似下面的信息,说明安装成功:

openjdk version "17.0.6" 2023-01-17
OpenJDK Runtime Environment ...

2. 安装IDE(开发工具)

推荐使用免费且强大的 IDE —— IntelliJ IDEA Community Edition


3. 创建Spring Boot项目

我们使用 https://start.spring.io 快速生成一个空项目。

步骤如下:

  1. 打开网址 https://start.spring.io
  2. 填写以下信息:
  • Project: Maven
  • Language: Java
  • Spring Boot Version: 默认最新稳定版(如3.x)
  • Group: com.example
  • Artifact: demo-security
  • Name: DemoSecurityApplication
  • Description: A basic security project
  • Packaging: Jar
  • Java Version: 17(根据自己安装的JDK选择)
  1. 添加依赖(Dependencies):

    • Spring Security
    • Spring Web(用于创建网页)
  2. 点击【Generate】按钮下载项目压缩包

  3. 解压后用IDEA导入项目:

    • 打开IDEA → File → New → Project from Existing Sources...
    • 选择解压后的文件夹中 pom.xml 文件 → Import as Maven Project

三、核心概念:Spring Security的几个关键词

为了方便理解,我们可以把Spring Security中的核心组件比作一栋楼里的安保系统。

1. 认证(Authentication)

相当于保安确认你是谁的过程,比如验证用户名和密码。

常用方式:

  • 表单登录(用户名+密码)
  • 第三方登录(QQ、微信)
  • Token登录(如JWT)

2. 授权(Authorization)

确认你是否有权做某件事,比如访问某个网页、添加数据、修改信息。

比如:

  • 普通用户看不到管理页面
  • 管理员可以发布文章

3. 用户存储(User Details Service)

类似于公司人事部的员工档案管理系统,记录每个员工的信息。

Spring Security允许我们:

  • 使用内存存储(测试用)
  • 数据库存储(实际用)

4. 密码加密(PasswordEncoder)

密码不能明文保存,要加密之后存数据库。

Spring Security内置了常用的加密算法,比如 BCryptPasswordEncoder。


5. 安全配置类(SecurityConfig)

这是我们要编写的核心类,用来配置整个安全系统的行为,比如:

  • 哪些页面需要登录才能访问
  • 登录页长什么样
  • 登出机制如何设置

四、实战项目:搭建一个简单的带登录的功能页面

现在我们来一步一步完成一个带有基本登录功能的小项目。

1. 创建Controller类

我们在 src/main/java/com/example/demo/controller/HomeController.java 中添加一个简单的页面入口:

package com.example.demo.controller;

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

@Controller
public class HomeController {

    @GetMapping("/")
    public String home() {
        return "index"; // 返回模板名称,需创建 index.html
    }
}

2. 创建前端页面

Spring Boot默认使用Thymeleaf作为模板引擎,我们只需在资源目录下添加HTML文件即可。

创建文件:src/main/resources/templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>首页</title>
</head>
<body>
<h1>欢迎来到首页!</h1>
<p><a href="/admin">前往管理页</a></p>
</body>
</html>

3. 创建管理页

再加一个管理页:src/main/resources/templates/admin.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>管理员页面</title>
</head>
<body>
<h1>管理员才可以看到的内容</h1>
</body>
</html>

4. 添加Spring Security配置类

接下来是最关键的部分:编写安全配置类。

在包路径下创建类 SecurityConfig.java

package com.example.demo;

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

@Configuration
public class SecurityConfig {

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

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

        return new InMemoryUserDetailsManager(user, admin);
    }

    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((requests) -> requests
                .requestMatchers("/").permitAll()  // 首页所有人都可访问
                .requestMatchers("/admin").hasRole("ADMIN") // /admin只允许ADMIN角色访问
                .anyRequest().authenticated()
            )
            .formLogin((form) -> form
                .loginPage("/login")  // 自定义登录页
                .permitAll()
            )
            .logout((logout) -> logout
                .permitAll()
            );

        return http.build();
    }
}

这段代码做了几件事:

  1. 设置两个用户到内存中(user和admin)
  2. 规定 / 路径不需要登录就能访问
  3. 规定 /admin 页面只有管理员能访问
  4. 设置登录页面为 /login
  5. 开启登出功能(后续会自动生成退出链接)

5. 创建登录页面

Spring Security默认没有提供登录页面,我们手动添加一个。

创建文件:src/main/resources/templates/login.html

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

<form method="post" action="/login">
    <label for="username">用户名:</label>
    <input type="text" id="username" name="username"><br><br>

    <label for="password">密码:</label>
    <input type="password" id="password" name="password"><br><br>

    <button type="submit">登录</button>
</form>

</body>
</html>

6. 运行项目并测试

点击运行启动类 DemoSecurityApplication,启动项目。

访问 http://localhost:8080

  • 点击“前往管理页”会被重定向到登录页
  • 输入正确的用户名和密码即可进入管理页面

五、常见问题解答(FAQ)

Q1:为什么我输入了正确的账号密码却无法登录?

可能是密码加密的问题。Spring Security要求密码必须加密存储。如果你用的是 .withDefaultPasswordEncoder() 是没问题的。但建议后面改用更安全的 BCryptPasswordEncoder

Q2:我不想用默认的登录页怎么办?

可以在配置类中使用 .loginPage("/custom-login") 并返回对应的页面。

Q3:如何让用户登录后记住我一段时间?

可以启用“记住我”功能,在配置类中加入:

.rememberMe(rem -> rem
    .tokenValiditySeconds(86400) // 有效期24小时
    .key("mySecretKey"))

Q4:怎么限制同时登录人数?

可以通过设置 session 策略实现。例如:

.sessionManagement(session -> session
    .maximumSessions(1)
    .maxSessionsPreventsLogin(true))

六、学习建议:下一步该学什么?

恭喜你完成了第一个Spring Security小项目!

接下来你还可以进一步深入以下几个方向:

✅ 推荐学习路径:

学习内容 用途
数据库集成 存储真实用户信息
JWT认证 移动端或前后端分离项目常用
OAuth2协议 支持第三方登录(如微信、GitHub)
RBAC权限模型 复杂项目的权限设计
Spring Security + Vue/React整合 前后端分离的安全架构
方法级别权限控制 控制具体方法是否可被调用

结语

通过本文的学习,你应该已经掌握了Spring Security的基础知识,并能够独立搭建一个具备登录、权限控制的基本Web安全系统。

学习编程最有效的方式就是动手实践,建议你尝试自己重新敲一遍示例代码,并尝试做一些扩展,比如:

  • 添加注册功能
  • 修改页面样式
  • 增加更多的用户角色和页面权限

坚持下去,你会越来越熟练掌握这套“Java世界的门禁系统”。

如果你觉得这个教程对你有帮助,也欢迎分享给其他刚入门的朋友一起学习!

评论 0

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