【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的安全性:使用 Spring Security 实现认证与授权

  <前文回顾>

点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshare=blogcolumn&sharetype=blogcolumn&sharerId=12907601&sharerefer=PC&sharesource=FoyoDesigner&sharefrom=from_link

<今日更新>

一、开篇整活儿

今儿个咱唠唠 Spring Boot 里头的安全性。这玩意儿吧,说大不大,说小不小,整好了是锦上添花,整不好就是火上浇油。你要是刚入门,那可得悠着点儿,别一上来就整得自己“翻车”了。

二、安全性是啥玩意儿?

安全性是系统开发里头的一个核心问题,说白了就是保证系统的数据和操作不被非法访问。Spring Boot 里头默认就集成了安全性,用起来贼方便。

1. 认证与授权

安全性里头有两个核心概念:认证(Authentication)和授权(Authorization)。

  • 认证:就是验证用户的身份,比如说用户名和密码。
  • 授权:就是验证用户的权限,比如说某个用户能不能访问某个资源。

2. Spring Security 是啥玩意儿?

Spring Security 是 Spring 里头的一个安全性框架,专门用来实现认证和授权。Spring Boot 里头默认就集成了 Spring Security,用起来贼方便。

三、Spring Boot 集成 Spring Security

Spring Boot 里头集成 Spring Security 很简单,只要加个依赖,配个安全性配置就行了。

1. 添加依赖

首先,你得在 pom.xml 里头加个 Spring Security 的依赖。

XML Code

<dependency>

    <groupId>org.springframework.boot</groupId>

    <artifactId>spring-boot-starter-security</artifactId>

</dependency>

这段代码里头,spring-boot-starter-security 是 Spring Boot 里头的 Spring Security 依赖。

2. 配置安全性

然后,你得在 application.properties 里头配个安全性配置。

Properties Code

spring.security.user.name=admin

spring.security.user.password=admin

这段代码里头,spring.security.user.name 是默认的用户名,spring.security.user.password 是默认的密码。

3. 使用 Spring Security

最后,你可以在代码里头用 Spring Security 来实现认证和授权。

Java Code

@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()

                .antMatchers("/public/**").permitAll()

                .anyRequest().authenticated()

                .and()

                .formLogin();

    }

}

这段代码里头,SecurityConfig 类继承了 WebSecurityConfigurerAdapter,重写了 configure 方法,配置了安全性。

四、Spring Boot 使用 JWT 实现认证

JWT(JSON Web Token)是一种开放标准(RFC 7519),用来在各方之间安全地传输信息。Spring Boot 里头使用 JWT 实现认证很简单,只要加个依赖,配个 JWT 配置就行了。

1. 添加依赖

首先,你得在 pom.xml 里头加个 JWT 的依赖。

Java Code

<dependency>

    <groupId>io.jsonwebtoken</groupId>

    <artifactId>jjwt</artifactId>

    <version>0.9.1</version>

</dependency>

这段代码里头,jjwt 是 JWT 的依赖。

2. 配置 JWT

然后,你得在 application.properties 里头配个 JWT 配置。

Properties Code

jwt.secret=mySecret

jwt.expiration=86400

这段代码里头,jwt.secret 是 JWT 的密钥,jwt.expiration 是 JWT 的过期时间。

3. 生成 JWT

最后,你可以在代码里头生成 JWT。

Java Code

@Service

public class JwtService {

    @Value("${jwt.secret}")

    private String secret;

    @Value("${jwt.expiration}")

    private long expiration;

    public String generateToken(String username) {

        return Jwts.builder()

                .setSubject(username)

                .setExpiration(new Date(System.currentTimeMillis() + expiration * 1000))

                .signWith(SignatureAlgorithm.HS512, secret)

                .compact();

    }

}

这段代码里头,generateToken 方法用 Jwts.builder 生成了一个 JWT。

五、Spring Boot 使用 JWT 实现授权

Spring Boot 里头使用 JWT 实现授权很简单,只要加个过滤器,配个授权配置就行了。

1. 添加过滤器

首先,你得在代码里头加个 JWT 过滤器。

Java Code

@Component

public class JwtFilter extends OncePerRequestFilter {

    @Autowired

    private JwtService jwtService;

    @Override

    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {

        String token = request.getHeader("Authorization");

        if (token != null && jwtService.validateToken(token)) {

            String username = jwtService.getUsernameFromToken(token);

            UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, null, new ArrayList<>());

            SecurityContextHolder.getContext().setAuthentication(authentication);

        }

        filterChain.doFilter(request, response);

    }

}

这段代码里头,JwtFilter 类继承了 OncePerRequestFilter,重写了 doFilterInternal 方法,实现了 JWT 过滤器。

2. 配置授权

然后,你得在 SecurityConfig 里头配个授权配置。

Java Code

@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired

    private JwtFilter jwtFilter;

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()

                .antMatchers("/public/**").permitAll()

                .anyRequest().authenticated()

                .and()

                .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);

    }

}

这段代码里头,addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) 表示在 UsernamePasswordAuthenticationFilter 之前添加 JwtFilter。

六、Spring Boot 使用 Spring Security 的坑点

1. 安全性配置不对

Spring Boot 里头,安全性配置不对,那认证和授权就不起作用了。你要是没配好,那可得好好检查检查。

Java Code

@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()

                .antMatchers("/public/**").permitAll()

                .anyRequest().authenticated()

                .and()

                .formLogin();

    }

}

这段代码里头,antMatchers("/public/**").permitAll() 表示 /public/** 路径下的资源不需要认证。

2. JWT 配置不对

Spring Boot 里头,JWT 配置不对,那认证和授权就不起作用了。你要是没配好,那可得好好检查检查。

Properties Code

jwt.secret=mySecret

jwt.expiration=86400

这段代码里头,jwt.secret 和 jwt.expiration 是 JWT 的配置。

3. 过滤器顺序不对

Spring Boot 里头,过滤器顺序不对,那认证和授权就不起作用了。你要是没配好,那可得好好调整调整。

Java Code

@Configuration

@EnableWebSecurity

public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired

    private JwtFilter jwtFilter;

    @Override

    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()

                .antMatchers("/public/**").permitAll()

                .anyRequest().authenticated()

                .and()

                .addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class);

    }

}

这段代码里头,addFilterBefore(jwtFilter, UsernamePasswordAuthenticationFilter.class) 表示在 UsernamePasswordAuthenticationFilter 之前添加 JwtFilter。

专有名词解释

  1. 安全性:系统开发里头的一个核心问题,保证系统的数据和操作不被非法访问。
  2. 认证:验证用户的身份,比如说用户名和密码。
  3. 授权:验证用户的权限,比如说某个用户能不能访问某个资源。
  4. Spring Security:Spring 里头的一个安全性框架,专门用来实现认证和授权。
  5. JWT:JSON Web Token,一种开放标准,用来在各方之间安全地传输信息。
  6. Jwts.builder:JWT 的一个类,用来生成 JWT。
  7. OncePerRequestFilter:Spring 里头的一个类,用来实现过滤器。
  8. UsernamePasswordAuthenticationToken:Spring Security 里头的一个类,用来表示用户名和密码的认证信息。
  9. SecurityContextHolder:Spring Security 里头的一个类,用来保存安全性上下文。
  10. addFilterBefore:Spring Security 里头的一个方法,用来添加过滤器。

=======================================================================

写在最后

身为一个中古程序猿,我有很多自己想做的事情,比如埋头苦干手搓一个低代码数据库设计平台(目前只针对写java的朋友),已经在找朋友内测了,比如很喜欢帮身边的朋友看看简历,讲讲面试技巧,毕竟工作这么多年,也做到过高管,有很多面人经历,意见还算有用,大家基本都能拿到想要的offer...

我深刻意识到,能自由做自己喜欢的事情是有多么不容易,又是多么有成就感。所以我拉了两三个志同道合的好友,开了一间公司,继续朝着“自由”的目标前进。

当下呢,我们希望有更多的朋友能够参与到产品的测试中来,体验并且给出更好的建议。未来可能会在博客po更多关于我们产品的内容,包括使用场景、说明、课程等,希望能对大家有所帮助。

另外,想整个花活儿,每天花个1-2小时,来帮助我素未谋面的老朋友们看看简历,提提意见啥的,纯属为爱发电。我在线时间不固定,但是不要米,咱就别要自行车儿了呗~如果您有兴趣,可以点击文章底部卡片一起交流(人工回复,比较慢,请担待)。

最后,请大家持续关注我们的博客,未来还有很多栏目,一起发掘~!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/75189.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

百元不入耳蓝牙耳机哪个品牌好用?2025百元不入耳耳机品牌推荐

在选择蓝牙耳机时&#xff0c;许多用户开始关注不入耳式设计&#xff0c;不仅能避免耳道不适&#xff0c;还能保持对环境音的感知&#xff0c;提升运动、通勤或日常使用的安全性。而在百元价位中&#xff0c;不入耳式耳机的品牌众多&#xff0c;产品质量参差不齐&#xff0c;如…

如何加强 SSH 安全:内网和专用网络环境下的防护策略

文章目录 如何加强 SSH 安全&#xff1a;内网和专用网络环境下的防护策略限制访问来源通过防火墙或安全组限制网络策略&#xff08;Network Policy&#xff09; 禁用密码登录&#xff0c;使用密钥认证启用 Fail2ban 或 SSH 防爆破限制 SSH 用户更改 SSH 端口使用跳板机&#xf…

ngx_monotonic_time

Ubuntu 下 nginx-1.24.0 源码分析 - ngx_monotonic_time函数-CSDN博客 定义在 src\core\ngx_times.c static ngx_msec_t ngx_monotonic_time(time_t sec, ngx_uint_t msec) { #if (NGX_HAVE_CLOCK_MONOTONIC)struct timespec ts;#if defined(CLOCK_MONOTONIC_FAST)clock_get…

【Trick】论文画图的icon来源

0&#xff1a;起因 群友在群里发了这种很好看的论文主图 其中不乏有很多icon&#xff0c;比如open-ai、机器人的 于是想知道应该如何找到&#xff0c;便有了后文 1&#xff1a;网址 阿里巴巴矢量图标库&#xff1a;iconfont-阿里巴巴矢量图标库 2&#xff1a;使用方法 可…

前端 技术栈

前端 技术栈 ChatGPT 说&#xff1a; 好咧&#xff0c;说到前端技术栈&#xff0c;这一块现在确实百花齐放&#xff0c;有点卷&#xff0c;但也超灵活。下面我来给你梳理一套2025年主流、实用、好上手的前端技术栈组合&#xff0c;按层级分类&#xff0c;一目了然&#xff1a;…

vue3 根据城市名称计算城市之间的距离

<template><div class"distance-calculator"><h1>城市距离计算器</h1><!-- 城市输入框 --><div class"input-group"><inputv-model"city1"placeholder"请输入第一个城市"keyup.enter"cal…

Java安全-FastJson反序列化分析

FastJson介绍 Fastjson 是阿里巴巴推出的一款高性能 JSON 序列化/反序列化库&#xff0c;由于其便捷性被广泛应用于 Java 项目中 FastJson使用 package org.example;import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject;public class FastjsonDemo {…

查看npm安装了哪些全局依赖

查看npm安装了哪些全局依赖 在macOS上&#xff0c;如果你想要查看通过npm全局安装的依赖包&#xff0c;你可以使用以下几种方法&#xff1a; 方法1&#xff1a;使用命令行 打开你的终端&#xff08;Terminal&#xff09;&#xff0c;然后输入以下命令&#xff1a; npm list -…

告别代码Bug,GDB调试工具详解

在软件开发的漫漫长路上&#xff0c;Bug 就像隐藏在黑暗中的 “小怪兽”&#xff0c;时不时跳出来给开发者们制造麻烦。曾经&#xff0c;欧洲航天局&#xff08;ESA&#xff09;首次发射阿丽亚娜 5 号火箭&#xff0c;这本是太空探索史上的重要时刻&#xff0c;却因一行代码导致…

LangChain4j(2):整合SpringBoot

1 新建Springboot项目 1.1 引入依赖 <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0…

移动端六大语言速记:第2部分 - 控制结构

移动端六大语言速记&#xff1a;第2部分 - 控制结构 本文继续对比Java、Kotlin、Flutter(Dart)、Python、ArkTS和Swift这六种移动端开发语言的控制结构&#xff0c;帮助开发者快速掌握各语言的语法差异。 2. 控制结构 2.1 条件语句 各语言条件语句的语法对比&#xff1a; …

Linux-线程概念与线程控制的常用操作

一.Linux线程概念 1-1.线程是什么 在Linux中&#xff0c;线程是基于Linux原有的进程实现的。本质是轻量级进程(LWP)。在⼀个程序⾥的⼀个执⾏路线就叫做线程&#xff08;thread&#xff09;。更准确的定义是&#xff1a;线程是“⼀个进程内部的控制序列”。 我们之前所学习的进…

dfs记忆化搜索刷题 + 总结

文章目录 记忆化搜索 vs 动态规划斐波那契数题解代码 不同路径题解代码 最长递增子序列题解代码 猜数字大小II题解代码 矩阵中的最长递增路径题解代码 总结 记忆化搜索 vs 动态规划 1. 记忆化搜索&#xff1a;有完全相同的问题/数据保存起来&#xff0c;带有备忘录的递归 2.记忆…

【HTML】验证与调试工具

个人主页&#xff1a;Guiat 归属专栏&#xff1a;HTML CSS JavaScript 文章目录 1. HTML 验证工具概述1.1 验证的重要性1.2 常见 HTML 错误类型 2. W3C 验证服务2.1 W3C Markup Validation Service2.2 使用 W3C 验证器2.3 验证结果解读 3. 浏览器开发者工具3.1 Chrome DevTools…

认识rand, srand, time函数,生成随机数

要完成猜数字游戏&#xff0c;首先要生成随机数&#xff0c;那么该怎么生成随机数&#xff1f;、 1.rand函数 rand函数是库函数&#xff0c;使用的时候要使用头文件stdlib.h c语言中&#xff0c;提供了rand函数来生成随机数&#xff0c;来看一下函数使用&#xff1a; 但是r…

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测(Matlab)

BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09; 目录 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多变量时序预测&#xff08;Matlab&#xff09;预测效果基本介绍程序设计参考资料 预测效果 基本介绍 BKA-CNN-GRU、CNN-GRU、GRU、CNN四模型多…

Go语言从零构建SQL数据库引擎(2)

SQL标准与数据库系统实现差异 在上一节中&#xff0c;我们了解了关系型数据库的基础概念。现在&#xff0c;让我们深入探讨SQL语言标准以及不同数据库系统之间的实现差异。 SQL语言的诞生与演进 想象你经营的咖啡店生意蒸蒸日上&#xff0c;需要一个更强大的系统来管理数据。…

智能导诊系统的技术体系组成

智能导诊系统的技术体系由基础支撑技术、核心交互技术、应用场景技术及安全保障技术构成&#xff0c;具体可归纳为以下六个维度&#xff1a; 一、基础支撑技术 1、AI大模型与深度学习 医疗大模型&#xff1a;如腾讯医疗AI、DeepSeek等&#xff0c;通过海量医学文献和病例训…

QML输入控件: TextField(文本框)的样式定制

目录 引言示例简介示例代码与关键点示例1&#xff1a;基础样式定制示例2&#xff1a;添加图标示例3&#xff1a;交互式元素&#xff08;清除按钮&#xff09; 实现要点总结完整工程下载 引言 在Qt Quick应用程序开发中&#xff0c;文本输入是最常见的用户交互方式之一。TextFi…

leetcode hot100 多维动态规划

1️⃣2️⃣ 多维动态规划&#xff08;区间 DP、状态机 DP&#xff09; 62. 不同路径 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图…