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

◆胡洋
2025-06-20 06:22
阅读 551

一、开篇:Spring Security 是什么?

一、开篇:Spring Security 是什么?

如果你正在学习 Java Web 开发,特别是使用 Spring Boot 框架,那你一定听说过 Spring Security。它是 Spring 家族中专门用来处理「权限控制」的模块。

简单来说,Spring Security 就是用来帮你保护你的网站或 API 不被未授权的人访问的工具。比如:

  • 用户必须登录后才能访问某个页面
  • 不同角色(如管理员和普通用户)能看到不同的内容
  • 防止攻击者尝试暴力破解密码

今天我们就要从零开始,一起用 Spring Security 做一个非常简单的登录认证系统!


二、环境准备:先搭好开发平台

二、环境准备:先搭好开发平台

在开始编码前,你需要准备好下面这些开发工具:

所需软件/环境:

  1. Java JDK 17 或更高版本
  2. IDE:推荐 IntelliJ IDEA Community 版本
  3. Spring Boot Initializr 在线工具:https://start.spring.io/
  4. Postman(测试API用)

✅ 提示:如果你是第一次用 Spring Boot,可以先跟着这个步骤一步步来。


第一步:创建 Spring Boot 项目

我们去 https://start.spring.io/ 创建一个新项目:

  • Project: Maven
  • Language: Java
  • Spring Boot Version: 最新稳定版即可(例如 3.0+)
  • Group: com.example
  • Artifact: securitydemo
  • Add Dependencies:
    • Spring Web
    • Spring Security
    • Thymeleaf(用于展示前端页面)

点击「Generate」下载 zip 包,解压后导入到 IDE 中。


第二步:运行你的第一个 Spring Boot 应用

把项目导入 IDEA 后,找到 SecuritydemoApplication.java 文件,运行它:

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

看到启动成功日志后,说明环境已经准备好了!


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

我们不讲太复杂的东西,先记住下面这几个重要术语,它们会帮助你理解整个流程。

1. 登录验证(Authentication)

就是判断你是谁。当用户输入用户名和密码时,系统要判断是不是合法用户。

2. 权限控制(Authorization)

确定你能做什么事情。比如管理员能删除用户,普通用户不能。

3. 角色(Role)

给用户分类的方法。常见的角色有 ROLE_USERROLE_ADMIN

4. Security Filter Chain

过滤器链是一个“守门员”,负责检查每个请求是否允许通过。


四、实战项目:快速搭建一个登录认证系统

第一步:添加一个简单的登录页

我们在 resources 下新建一个 HTML 页面:
路径为:src/main/resources/templates/login.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="UTF-8">
    <title>登录页面</title>
</head>
<body>
    <h1>欢迎登录</h1>
    <form th:action="@{/login}" method="post">
        <div>
            <label>用户名:</label>
            <input type="text" name="username" />
        </div>
        <div>
            <label>密码:</label>
            <input type="password" name="password" />
        </div>
        <button type="submit">登录</button>
    </form>
</body>
</html>

缓存策略对比-1


第二步:编写控制器显示登录页

创建一个 Controller 类,用于返回登录页:

文件路径:src/main/java/com/example/securitydemo/controller/LoginController.java

package com.example.securitydemo.controller;

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

@Controller
public class LoginController {

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

这时候你可以访问:http://localhost:8080/login 看到登录界面!


第三步:配置 Spring Security

我们现在要告诉 Spring Security:

  • 谁需要登录?
  • 怎么处理登录过程?

创建配置类:
src/main/java/com/example/securitydemo/config/SecurityConfig.java

package com.example.securitydemo.config;

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.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 userDetailsManager() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("123456")
                .roles("USER")
                .build();
        UserDetails admin = User.withDefaultPasswordEncoder()
                .username("admin")
                .password("admin123")
                .roles("ADMIN")
                .build();


![API接口文档-2](https://code-guide.oss.shanghai.autogptai.club/common/file/download?name=date2025062006/8782d59a-3fad-493c-9c3b-577fda51d6a7.jpg)


        return new InMemoryUserDetailsManager(user, admin);
    }

    // 安全过滤规则
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/").permitAll()      // 允许所有人访问首页
                .anyRequest().authenticated())          // 其他请求都需要登录
            .formLogin(login -> login
                .loginPage("/login")                   // 自定义登录页
                .defaultSuccessUrl("/home", true)       // 登录成功跳转
                .permitAll())
            .logout(logout -> logout.permitAll());

        return http.build();
    }
}

解释几个关键点:

  • InMemoryUserDetailsManager:表示我们是临时把用户名和密码存内存里
  • .anyRequest().authenticated():所有请求都必须登录
  • .formLogin():表示我们要启用表单登录功能

第四步:添加一个受保护页面

再加一个只能登录后访问的页面:

修改 LoginController.java

@GetMapping("/home")
public String home() {
    return "home";  // 返回 templates/home.html
}

新建模板文件 src/main/resources/templates/home.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>主页</title>
</head>
<body>
    <h1>欢迎来到主页!你已登录</h1>
    <a href="/logout">退出登录</a>
</body>
</html>

第五步:跑起来,试试看!

重新启动程序,然后访问:

  • http://localhost:8080/login → 输入 user / 123456 或 admin / admin123
  • 登录成功会被跳转到 /home
  • 如果访问 /home 没有登录,会被拦截并跳回登录页

✅ 成功!你已经完成了第一个 Spring Security 认证系统!


五、常见问题解答(FAQ)

1. Q:为什么不能直接用明文密码?

A:为了安全起见,生产环境下应该使用加密过的密码。上面的例子是为了方便初学者演示,实际要使用 Bcrypt 密码加密方式。

2. Q:为什么我访问 /home 总是提示 403?

A:可能是你没登录就访问了受保护资源,请先完成登录操作后再访问。也可以尝试清除浏览器缓存或换个浏览器无痕模式测试。

3. Q:如何实现“多个角色不同权限”?

A:可以通过 hasRole("ADMIN") 设置某接口只能由管理员访问。这部分我们会在后续课程详细讲解。

4. Q:登出按钮不起作用?

A:Spring Security 默认支持 /logout 请求,确保你用了 POST 方法。你也可以添加 <form action="/logout" method="post"> 来强制使用 POST。


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

恭喜你入门了 Spring Security!接下来你可以继续学习以下几个方向:

✅ 进阶知识点清单

学习方向 内容简述
数据库存储用户信息 把用户名密码存在 MySQL 等数据库中
使用 JWT 认证 实现前后端分离项目的 token 登录机制
配置多个登录页面 例如管理员页面和前台用户的登录页面分开
OAuth2 登录集成 接入微信、QQ、GitHub 等第三方登录
RBAC 权限模型 更复杂的权限控制逻辑

📚 学习资源推荐


结语:坚持实践才是王道!

Spring Security 是 Java Web 开发中非常重要的一环。刚开始可能会有点难懂,但只要你一步一步写代码、调试、思考原理,就会慢慢掌握。

现在你已经拥有了自己的第一个安全认证系统,别忘了自己试着扩展功能,比如:

  • 添加注册页面
  • 实现记住我功能
  • 增加登录失败提示

下一次我们再来聊聊 Spring Security 如何结合数据库做认证? 敬请期待!


📌 如果你喜欢这个教程,欢迎点赞、收藏或者转发给其他新手小伙伴!我们一起进步 💪

评论 0

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