SpringSecurity基础

SpringSecurity

安全

网站设计之初就要考虑安全框架

环境

  • 打开idea建立一个springboot项目

  • pom选择添加web

  • 再加一个thymreleaf

  • 导入模板(上网随便下)

    image-20251205163251104

  • 写一个RouterConTtroller

    用于将页面实现url跳转

    路径+id:通过id跳转

    把上面的素材,照着这样写即可

  • 跑一下就是这样的

    image-20251205163808685

介绍

官方文档:
Spring Security 中文文档 参考手册 中文版

Spring Security 是针对Spring项目的安全框架,也是Spring Boot底层安全模块默认的技术选型,他可以实现强大的Web安全控制,对于安全控制,我们仅需要引入 spring-boot-starter-security模块,进行少量的配置,即可实现强大的安全管理

记住几个类:

  • WebSecurityConfigurerAdapter:自定义Security策略
  • AuthenticationManagerBuilder:自定义认证策略
  • @EnableWebSecurity:开启Websecurity模式

Spring Security的两个主要目标是“认证”和“授权”(访问控制)。

“认证”(Authentication)
“授权”(Authorization)

这个概念是通用的,而不是只在Spring Security 中存在

实例

  • 先导入依赖

    1
    2
    3
    4
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-security</artifactId)
    </dependency>
  • 导入之后会多这三个包

    着重看一下 导入了一个AOP的包

    AOP:

    (面向切面编程)(横向编程) 是一种编程范式,允许将跨越多种功能的关注点(例如日志记录、事务管理、安全性等)从应用程序的业务逻辑中分离出来。AOP 使得这些关注点能够模块化,减少重复的代码,增加代码的可维护性和可扩展性。

    AOP的实现方式:

    1. JDK 动态代理:基于接口的代理,只有当目标类实现了接口时才能使用。它通过 java.lang.reflect.Proxy 类创建代理对象。
    2. CGLIB代理:基于子类的代理,目标类不需要实现接口,代理对象通过字节码技术生成。适用于没有接口的类。
    3. AspectJ:一种强大的 AOP 框架,它支持编译时、类加载时和运行时织入。

编写

直接看着官方文档来写就好

  • 先创一个SecurityConfig文件(在这个里面写即可)

    image-20251205183744718

    注意导入包

    现在展示的是固定的。(就和java的public class xxxx一样)

授权

  • 弄首页所有人可以访问,功能页有权限的可访问

    image-20251206154058518

  • 没有权限默认到登陆页面

    image-20251206154149723

    • 有没有发现我们没有配置login页面,他就自己跳转了呢

      image-20251206154252416

      这个是formLogin帮我们做的

认证

  • image-20251206154621777

    使用.and()拼接

    正常应该是从数据库里面读取,这里我们是自己写的数据

  • 但是因为版本问题,后面版本优化,对账号密码进行加密

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // 这些数据正常应该从数据库中读
        auth.inMemoryAuthentication()
            .passwordEncoder(new BCryptPasswordEncoder())
            .withUser("kuangshen")
                .password(new BCryptPasswordEncoder().encode("123456")).roles("vip2","vip3")
                .and()
            .withUser("root")
                .password(new BCryptPasswordEncoder().encode("123456")).roles("vip1","vip2","vip3")
                .and()
            .withUser("guest")
                .password(new BCryptPasswordEncoder().encode("123456")).roles("vip1");
    }
  • image-20251206160207109

    用数据库就是绑定JDBC

注销

  • image-20251206160257947

    这是注销功能

  • 改个前端即可

  • 注销返回首页

    image-20251206161759205

  • 防止csrfimage-20251206161931179

thymreleaf

从官方文档修改html中对应的地方即可实现


SpringSecurity基础
http://example.com/2025/12/07/SpringSecurity/
作者
Piggy Sprint
发布于
2025年12月7日
许可协议