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

深巷里的服务器
2025-06-16 16:53
阅读 487

开篇:Spring Security 是什么,用来做什么?

开篇:Spring Security 是什么,用来做什么?

如果你是一个刚开始学习 Java Web 开发的新手,可能会听说“安全”这个词在开发中非常重要。比如网站的登录功能、权限控制这些功能就属于“安全”的范畴。那么,有没有一个现成的框架可以帮助我们轻松实现这些功能呢?答案是——有!那就是 Spring Security

Spring Security 是 Spring 框架的一个子项目,专门用于保护基于 Spring 的应用程序。它提供了登录认证、权限控制、防止 CSRF 攻击等一系列安全功能。无论你是想做用户登录系统,还是更复杂的权限管理功能,Spring Security 都能帮你搞定。

本篇文章的目标是帮助你从零开始,一步一步地搭建一个最简单的 Spring Security 安全认证系统。我们将通过实践带你熟悉它的基本用法,适合没有 Spring Security 使用经验的新手朋友。


环境准备:搭建开发环境

环境准备:搭建开发环境

为了顺利运行我们的项目,需要准备好以下工具和环境:

所需软件与版本(推荐)

  • JDK 17 或以上
  • IntelliJ IDEA 或 VS Code + Java 插件
  • Maven 构建工具(建议版本 3.8.x 及以上)
  • Spring Boot(2.7.x 或更高)

创建 Spring Boot 项目

使用 Spring Initializr 创建新项目:

  1. 访问网址:https://start.spring.io/
  2. 设置如下:
    • Project: Maven
    • Language: Java
    • Spring Boot Version: 2.7.x 或更新的版本
    • Group: com.example
    • Artifact: sec-demo
    • Dependencies:
      • Spring Web
      • Spring Security

点击【Generate】下载 zip 文件,解压后用 IDE 打开。

Maven依赖配置(pom.xml)

确保 pom.xml 中已经包含 Spring Security 的依赖包,类似下边这段代码:

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

✅ 到此为止,我们的开发环境就准备好了!


核心概念:Spring Security 的几个关键角色

核心概念:Spring Security 的几个关键角色

虽然 Spring Security 功能强大,但刚接触可能觉得术语有点多。别担心,下面我会用通俗的方式讲解几个最核心的概念。


1. 认证(Authentication)

认证就是“确认你是谁”。比如你登录 QQ 的时候输入账号和密码,QQ 系统就会验证你是不是这个账号的主人。Spring Security 提供了各种方式来完成这个过程,比如表单登录、OAuth 登录等。


2. 授权(Authorization)

授权是指“你能干什么”。比如你在公司系统里是一个普通员工,只能看到自己的工资数据,而管理员能看到所有人的信息。这种访问控制就需要授权机制来完成。


3. 用户凭证(UserDetails)和用户服务(UserDetailsService)

这两个东西负责存储用户的登录信息,如用户名、密码和角色(权限)。你可以把它理解为“用户数据库”的一种抽象表达。


4. 安全配置类(SecurityConfig)

这是我们需要自定义的一个配置类。在 Spring Boot 应用中,通过继承 WebSecurityConfigurerAdapter 类或者直接使用新的方式配置(根据 Spring Security 版本),我们可以对登录逻辑、访问控制等进行自定义。

✅ 总结:

  • 认证 = 身份确认
  • 授权 = 权限控制
  • 我们需要编写一些配置来告诉 Spring Security 如何处理认证和授权。

实战项目:一步步完成你的第一个 Spring Security 登录认证系统

现在让我们动手写代码,一步步搭建一个拥有登录页面的简单 web 安全系统。


第一步:创建一个最简化的 controller 页面

创建一个文件:src/main/java/com/example/secdemo/HelloController.java,内容如下:

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

@Controller
public class HelloController {

    // 主页
    @GetMapping("/")
    public String index() {
        return "index";
    }

    // 需要登录才能访问的页面
    @GetMapping("/hello")
    public String hello() {
        return "hello";
    }
}

然后,在 resources 目录创建两个页面模板:

  • resources/templates/index.html
<!DOCTYPE html>
<html>
<head>
    <title>首页</title>
</head>
<body>
<h2>欢迎来到主页!</h2>
<a href="/hello">进入打招呼页面</a>
</body>
</html>
  • resources/templates/hello.html
<!DOCTYPE html>
<html>
<head>
    <title>Hello Page</title>
</head>
<body>
<h2>Hello, 你好!</h2>
</body>
</html>

此时访问 http://localhost:8080 就能看到主页,点击链接就能跳转到 /hello 页面。

接下来我们开始设置登录功能。


第二步:启用 Spring Security 并设置默认账户密码

创建配置类:SecDemoApplication.java 同目录下新建 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.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.provisioning.InMemoryUserDetailsManager;
import org.springframework.security.web.SecurityFilterChain;

@Configuration
@EnableWebSecurity
public class SecurityConfig {

    // 自定义用户列表(内存中的用户)
    @Bean
    public UserDetailsService userDetailsService() {
        UserDetails user = User.withDefaultPasswordEncoder()
                .username("user")
                .password("123456")
                .roles("USER")
                .build();
        return new InMemoryUserDetailsManager(user);
    }

    // 安全规则配置
    @Bean
    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
            .authorizeHttpRequests((requests) -> requests
                .requestMatchers("/", "/css/**", "/js/**").permitAll() // 主页所有人都能访问
                .anyRequest().authenticated() // 其他请求都必须登录
            )
            .formLogin((form) -> form
                .loginPage("/login") // 自定义登录页路径
                .permitAll()
            )
            .logout((logout) -> logout.permitAll());
        return http.build();
    }
}

⚠️ 注意事项:

  • 上面的 withDefaultPasswordEncoder() 方法仅用于测试,请勿用于生产。
  • .loginPage("/login") 中我们指定登录页面地址,后面会创建它。

第三步:创建登录页面 login.html

在 templates 下新建 login.html

<!DOCTYPE html>
<html>
<head>
    <title>登录页面</title>
</head>
<body>
<h2>请登录</h2>
<form method="post" action="/login">
    <label>用户名:
        <input type="text" name="username"/>
    </label><br/>
    <label>密码:
        <input type="password" name="password"/>
    </label><br/>
    <button type="submit">提交</button>
</form>
</body>
</html>

第四步:启动项目并测试

启动 Spring Boot 项目后访问:

在登录页面填写用户名 user 和密码 123456 即可成功登录。

✅ 成功啦!至此,你已经完成了最基本的 Spring Security 安全认证系统!


常见问题解答

Q1:我输入正确的用户名密码却无法登录?

  • A:检查是否忘记配置 .permitAll() 在登录页面路径上;
  • 确保密码未被加密,测试阶段可继续使用 withDefaultPasswordEncoder()
  • 查看日志输出是否有错误提示。

Q2:如何添加多个用户?

  • A:你可以调用多次 User.withDefaultPasswordEncoder(),把每个用户加进去,示例:
UserDetails user1 = User.withDefaultPasswordEncoder().username("user1").password("pass1").roles("USER").build();
UserDetails admin = User.withDefaultPasswordEncoder().username("admin").password("admin").roles("ADMIN").build();

return new InMemoryUserDetailsManager(user1, admin);

Q3:如何退出登录?

  • A:访问 /logout 就可以退出。Spring Security 默认支持这个路径。

Q4:我想连接真实数据库怎么办?

  • A:后续你可以实现 UserDetailsService 接口,并结合数据库查询实现动态读取用户信息的功能。

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

你已经完成了 Spring Security 的入门知识,掌握了基本的登录认证和页面控制。接下来你可以尝试以下学习路线进阶:

  1. 用户角色管理:学习如何区分不同用户角色(如 USER / ADMIN)并控制访问;
  2. 前后端分离开发:了解 JWT(JSON Web Token)实现无状态认证;
  3. 数据库用户验证:将用户信息保存到 MySQL 等数据库中;
  4. CSRF/XSS 安全机制:进一步加固应用的安全性;
  5. OAuth2 / OpenID Connect 登录:接入第三方登录,如微信、QQ 登录。

结语

恭喜你完成了这篇《Spring Security 基础:快速搭建安全认证系统》教程!虽然只用了最基本的功能,但这为你今后深入掌握 Java Web 安全技术打下了扎实的基础。记住,安全是一个持续学习的过程,随着你项目的复杂程度增加,Spring Security 还会给你提供更多的功能模块。

继续加油,愿你成为一名出色的安全开发者! 🚀

评论 0

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