零基础也能搞定:用Spring Security快速搭建Java安全认证系统

邓雨泽
2026-01-15 04:32
阅读 369

大家好,我是掘金上常写教程的全栈工程师。最近在带实习生时发现,很多刚接触后端开发的同学对“用户登录”这件事既熟悉又陌生——天天用App登录,但自己写却无从下手。尤其是看到 Spring Security 这个名字,总觉得高深莫测。

其实,Spring Security 并没有那么可怕。我当初学的时候也踩过不少坑,比如配置完连页面都打不开、密码明明对却一直报错……今天这篇教程,就是想用最直白的方式,带你从零开始搭建一个带用户名密码登录的安全系统,哪怕你今天才第一次听说“认证”这个词,也能跟着做完。


为什么需要 Spring Security?

想象一下:你的网站有后台管理页面,只有管理员才能进;普通用户注册后能看自己的订单。如果没做任何保护,黑客随便改个 URL 就能访问别人的数据——这显然不行。

Spring Security 就是 Java 生态中最主流的安全框架,它帮你自动处理:

  • 用户登录/登出
  • 密码加密存储
  • 权限控制(谁可以访问哪个接口)
  • 防止 CSRF、XSS 等常见攻击

而你要做的,只是写几行配置代码。


开发环境准备(5分钟搞定)

确保你已安装以下工具:

工具 版本建议 用途
JDK 17 或 21 Java 运行环境
Maven 3.6+ 项目依赖管理
IDE IntelliJ IDEA(推荐) 编码工具
Spring Boot 3.x 快速构建应用

💡 运营小贴士:作为开发者,别忽视环境一致性。建议团队统一 JDK 和 Spring Boot 版本,避免“在我电脑上能跑”的尴尬。

创建项目

打开 Spring Initializr,选择:

  • Project: Maven
  • Language: Java
  • Spring Boot: 最新版(如 3.2.x)
  • Dependencies: Spring Web, Spring Security

下载后导入 IDE,项目结构如下:

src/
 └── main/
     ├── java/
     │   └── com.example.demo/
     │       └── DemoApplication.java
     └── resources/
         └── application.properties

核心概念三句话讲清楚

新手最容易被术语吓到,其实就三个核心:

  1. Authentication(认证):你是谁?→ 输入用户名密码登录
  2. Authorization(授权):你能干什么?→ 管理员能删用户,普通用户不能
  3. PasswordEncoder(密码编码器):密码不能明文存!必须加密(如 BCrypt)

开发心得:永远不要自己实现密码加密逻辑!直接用 Spring Security 提供的 BCryptPasswordEncoder,安全又省事。


实战:搭建一个带登录页的简单系统

我们目标:启动项目后,访问 /admin 需要登录,且只有 admin 用户能进。

第一步:添加必要依赖(pom.xml 已包含)

Spring Initializr 已自动加上:

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

第二步:配置内存用户(快速测试用)

在主类同包下新建 SecurityConfig.java

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 userDetailsService() {
        UserDetails admin = User.builder()
                .username("admin")
                .password("{bcrypt}$2a$10$GRLdNijSQMUvl/au9ofL.eDwmoohzzS7.rmNSJZ.0FxO/BTk7fL5u") // 密码:123456
                .roles("ADMIN")
                .build();
        return new InMemoryUserDetailsManager(admin);
    }

    @Bean
    public SecurityFilterChain filterChain(Http security) throws Exception {
        security
            .authorizeHttpRequests(auth -> auth
                .requestMatchers("/admin").hasRole("ADMIN")
                .anyRequest().authenticated()
            )
            .formLogin(form -> form
                .loginPage("/login")      // 自定义登录页路径
                .permitAll()              // 登录页无需认证
            )
            .logout(logout -> logout
                .permitAll()
            );
        return security.build();
    }
}

🔒 密码说明:上面的密文是用 BCrypt 加密 123456 得到的。你也可以在测试时用 {noop}123456(不加密),但生产环境绝对禁止

第三步:创建控制器和页面

新建 WebController.java

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

@Controller
public class WebController {

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

    @GetMapping("/admin")
    @ResponseBody
    public String adminPage() {
        return "欢迎,管理员!";
    }
}

resources/templates 下创建 login.html(需先加 Thymeleaf 依赖):

<!-- 简易登录页 -->
<form action="/login" method="post">
    用户名: <input type="text" name="username"><br>
    密码: <input type="password" name="password"><br>
    <button type="submit">登录</button>
</form>

⚠️ 别忘了在 pom.xml 加 Thymeleaf:

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

第四步:启动并测试

  1. 运行 DemoApplication.main()
  2. 浏览器访问 http://localhost:8080/admin
  3. 自动跳转到 /login
  4. 输入用户名 admin,密码 123456
  5. 成功进入管理员页面!

新手常见问题 & 解决方案

❌ 问题1:启动后自动生成一串随机密码?

这是 Spring Security 的默认行为(当你没配用户时)。解决方案:务必自定义 UserDetailsService,如上文所示。

❌ 问题2:登录后还是跳回登录页?

检查三点:

  1. 密码是否加密?明文密码需加 {noop} 前缀(仅测试!)
  2. 表单字段名是否为 usernamepassword?(Spring Security 默认这么取)
  3. 是否漏了 .permitAll() 导致登录页也被拦截?

❌ 问题3:如何放行首页或静态资源?

authorizeHttpRequests 中加规则:

.requestMatchers("/", "/css/**", "/js/**").permitAll()

下一步学习建议

你现在已掌握 Spring Security 的“最小可行系统”。接下来可深入:

  1. 连接数据库:用 JdbcUserDetailsManager 或自定义 UserDetailsService 查询 MySQL 用户
  2. JWT 无状态认证:适合前后端分离项目(如 Vue + Spring Boot)
  3. OAuth2 集成:支持微信/Google 第三方登录
  4. 权限粒度细化:基于方法(@PreAuthorize)或数据行级控制

📌 避坑指南:不要一上来就学 OAuth2 或 JWT!先把表单登录搞透,理解过滤器链(Filter Chain)机制,后面学新东西会快十倍。


写在最后

作为从零开始一路摸爬滚打过来的工程师,我深知初学者面对安全框架时的焦虑。但请相信:所有复杂系统,都是由简单模块堆叠而成。今天你搭的这个小系统,就是未来企业级认证体系的雏形。

运营一个产品,安全是底线;开发一个系统,认证是起点。希望这篇教程能成为你 Java 安全之路的第一块垫脚石。

有问题欢迎在评论区留言,我会一一解答。下次见!

评论 0

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