当前位置: 代码网 > it编程>编程语言>Java > 最新Spring Security实战教程之Spring Security安全框架指南

最新Spring Security实战教程之Spring Security安全框架指南

2025年03月19日 Java 我要评论
前言随着web应用和微服务架构的普及,作为java开发者如何保证系统免受各种安全威胁(如未经授权的访问、数据泄露、跨站请求伪造等)成为一个我们必须要解决的问题。spring security 作为sp

前言

随着web应用和微服务架构的普及,作为java开发者如何保证系统免受各种安全威胁(如未经授权的访问、数据泄露、跨站请求伪造等)成为一个我们必须要解决的问题。

spring security 作为spring 生态系统中的核心组件,通过提供认证(authentication)与授权(authorization)和针对常见攻击等一系列安全功能,为开发者构建安全稳定的应用提供了强有力的支持。

什么是spring security?

官方文档:https://docs.spring.io/spring-security/reference/index.html

spring security是一个基于spring框架的强大安全解决方案,它为应用提供了一整套安全服务,主要包括以下几个方面:

  • 认证(authentication): 确定访问者身份的过程。spring security通过多种方式(如表单登录、basic认证、oauth2等)实现用户身份验证。
  • 授权(authorization): 根据用户身份和权限确定资源访问级别。开发者可以通过配置或注解的方式,灵活地控制不同用户对不同资源的访问权限。
  • 防护机制: 包括防止跨站请求伪造(csrf)、点击劫持等攻击手段,保障应用在网络攻击面前的稳定性。

这种以拦截器和过滤器链为核心的设计,使得spring security能够在请求到达业务逻辑之前,先进行安全检查,从而构建出一层坚固的防护屏障。

同类框架对比

说到安全框架,我们就不得不提另外一个轻量级的安全管理框架 apache shiro ,它有三个核心组件:subject, securitymanagerrealms , shiro 的相关内容大家可以自行学习,这里不做过多介绍了

下面博主总结两个框架的一些对比:

特性spring securityapache shiro
学习曲线较陡峭易上手
功能完整性★★★★★★★★☆☆
spring生态集成原生支持需要适配
微服务支持oauth2/jwt需自行扩展
社区活跃度极高一般

通过上述的对比图,可以总结出:

  • spring security是一个重量级的安全管理框架;shiro则是一个轻量级的安全管理框架
  • spring security 上手稍有难度,shiro 的配置和使用比较简单
  • shiro 依赖性低,不需要任何框架和容器,可以独立运行
  • 如果你的项目基于spring容器,那么优先推荐spring security

spring security典型应用场景

传统web应用安全

通过配置实现url级权限控制

@configuration
@enablewebsecurity
public class websecurityconfig {
    @bean
    public securityfilterchain securityfilterchain(httpsecurity http) throws exception {
        http
            .authorizehttprequests(auth -> auth
                .requestmatchers("/admin/**").hasrole("admin")
                .anyrequest().authenticated()
            )
            .formlogin(form -> form
                .loginpage("/login")
                .permitall()
            );
        return http.build();
    }
}

前后端分离架构

  • jwt令牌自动校验
  • 无状态会话管理
  • 跨域安全配置(cors)

微服务安全网关

资源服务器配置示例

spring:
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://auth-server:9000

快速搭建安全环境

以博主本机环境为例

jdk 17+
spring boot 3.4.3
maven 3.9+
ide(intellij idea或vs code)

为了方便大家学习给大家提供一个官方代码案例地址:
https://github.com/spring-projects/spring-security-samples/tree/main

❶ 创建spring boot项目

使用 start.spring.io 生成项目,勾选以下依赖:

<dependencies>
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-web</artifactid>
    </dependency>
    <dependency>
        <groupid>org.springframework.boot</groupid>
        <artifactid>spring-boot-starter-security</artifactid>
    </dependency>
</dependencies>

❷ 测试安全访问

创建测试控制器,我们希望访问 /public 无需验证身份,访问 /private 需要用户登录

@restcontroller
public class democontroller {
    @getmapping("/public")
    public string publicapi() {
        return "无需认证的公开接口";
    }
    @getmapping("/private")
    public string privateapi() {
        return "需要登录的私有接口";
    }
}

现在我们不管访问哪一个接口地址,均会跳出一个登陆页

账号默认 user ,密码由spring security 自动帮我们生成,观察控制台

❸ 实现url身份验证

通过上述测试要求,目前我们访问 /public 还是会出现登录要求,接下来我们创建一个陪你类,以实现这个需求

@configuration
public class basicsecurityconfig {
    // 配置安全策略
    @bean
    public securityfilterchain filterchain(httpsecurity http) throws exception {
        http.
                authorizehttprequests(authorize -> authorize
                        .requestmatchers("/public/**").permitall()
                        .anyrequest().authenticated()
                )
                .formlogin(withdefaults())
                .logout(withdefaults());
        return http.build();
    }
}

现在我们继续访问 /public 发现已经不再需要身份验证了,可以直接访问测试

访问 /private 需要登录验证,登陆后即可访问

上述配置文件中

requestmatchers(“/public/**”).permitall() 表明放行public访问路径下所有接口
formlogin(withdefaults()) 采用默认的登录处理
logout(withdefaults()) 采用默认的登出处理

结语

本章节主要带领大家认识spring security安全框架,并构建一个简单的 spring boot + spring security 的项目让大家有一个大致了解。

在接下来的专栏中,我们将逐步深入 spring security 的各个技术细节,带你从入门到精通,全面掌握这一安全技术的方方面面。欢迎继续关注!

下一章节:最新spring security实战教程(二)表单登录定制到处理逻辑的深度改造

到此这篇关于最新spring security实战教程之初识spring security安全框架的文章就介绍到这了,更多相关spring security安全框架内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com