Spring Security 结合 JWT使用

Spring Security原理

Spring Security的原理主要基于过滤器链的概念。在Web应用程序中,每个请求都会通过一系列的过滤器,Spring Security就是在这个过程中介入并进行安全相关的操作。

Spring Security的核心原理可以概括为以下几点:

1. 认证(Authentication):认证是验证用户身份的过程。用户提供用户名和密码,通过Spring Security的认证过程进行验证。认证可以使用内置的用户名密码验证、LDAP、数据库验证或自定义验证等。

2. 授权(Authorization):授权是检查用户对资源的访问权限。一旦用户身份被认证,Spring Security会根据定义的授权策略来确定用户是否有权访问请求的资源。

3. 过滤器链(Filter Chain):Spring Security的核心机制是通过一系列的过滤器链来处理请求。每个过滤器负责不同的安全任务,比如身份验证、授权、会话管理等。过滤器链可以根据应用程序的需求进行定制和配置。

4. 安全上下文(Security Context):安全上下文是Spring Security用于存储当前用户的安全信息,比如认证信息、授权信息等。安全上下文可以通过`SecurityContextHolder`来访问和管理。

5. 注解支持:Spring Security提供了一组注解,可以在应用程序中方便地进行权限控制。例如,@PreAuthorize注解可以用于在方法级别进行授权检查。

总结来说,Spring Security通过认证、授权和过滤器链的机制,提供了一套完整的安全解决方案,可以保护应用程序免受未经授权的访问。它的灵活性和易用性使得开发人员可以快速集成和定制安全功能。

tomcat容器结构

java web工作结构

security工作原理 

为什么要结合JWT使用? 

Spring Security与JWT(JSON Web Token)的结合在实际应用中使用的场景比较多,主要有以下几个原因:

1. 基于令牌的无状态身份验证:JWT是一种基于令牌的身份验证机制,使用签名和加密来保证令牌的安全性。相比使用传统的session和cookie来管理用户状态,JWT具有无状态性(无需在后端存储会话信息)和可扩展性的优势,适用于分布式系统和微服务架构,实现了Session共享.

2. 面向移动端和单页应用:对于移动端和单页应用,传统的session和cookie机制不够灵活,而JWT通过将身份验证信息存储在令牌中,便于在客户端和服务器之间进行传递和验证。JWT可以作为一个轻量级的令牌被存储在移动应用或前端应用的本地存储中,在每次请求时进行身份验证。

3. 跨域和分布式系统:在分布式系统中,不同服务可能由不同的域提供,因此可能会遇到跨域请求的问题。JWT通过将身份验证信息包含在请求头中,不受同源策略的限制,可以在不同域之间进行安全的身份验证和授权传递。

4. 可扩展的自定义声明:JWT除了包含基本的身份验证信息外,还可以包含自定义的声明(Claims),这些声明可以用于传递更多的用户信息或其他业务数据。在使用JWT的过程中,可以根据实际需求自定义声明的内容,方便灵活地扩展应用功能。

5. Spring Security的集成:Spring Security提供了与JWT的集成支持,可以方便地通过配置和过滤器来实现JWT的解析和验证。通过Spring Security的强大功能,可以轻松实现角色和权限的控制,同时与其他Spring生态系统的模块(如Spring Boot)集成。

综上所述,Spring Security与JWT的结合在分布式系统、移动端和单页应用等场景下具备灵活性、可扩展性和安全性,因此被广泛应用于现代Web应用程序的身份验证和授权中。

说白了JWT有不可替代的优势,但Security也有使用的便利性(已内置了很多权限验证功能),所以我们要结合一起使用,结合的时候,我们只使用Security鉴权功能,登陆功能不需要,因为我们已经自己实现了JWT相关的登陆接口,只是登陆成功后我们要把用户的角色Role写进token就可以了.

使用步骤

添加Spring Security依赖

在你的Spring Boot项目的pom.xml文件中,添加Spring Security的依赖:

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

添加SecurityConfig配置

@Configuration
@EnableWebSecurity //开启spring security,可以省略
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.csrf().disable(); //禁用跨域功能
        http.logout().disable(); //禁用注销功能
        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);//禁用session功能
        http    .authorizeRequests()
                   .antMatchers("/api/user/register","/api/user/login").anonymous() //antMatchers可以精细化配置
                   .anyRequest().authenticated(); //除了上面的配置以外,所有的请求都需要认证
        http.addFilter(new TokenFilter(this.authenticationManager())); //把token里面的角色方法SecurityContextHolder里面
        http.exceptionHandling().authenticationEntryPoint((request,response,authException)->{
            response.setContentType("application/json; charset=utf-8");
            response.getWriter().write("{'code':403,'msg':'权限不足'}");
        });

    }
    public static  class  TokenFilter extends BasicAuthenticationFilter {
        public TokenFilter(AuthenticationManager authenticationManager) {
            super(authenticationManager);
        }
        @Override
        protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {
            String token = request.getHeader("token");
            if(ObjUtil.isNotEmpty(token)){
                LocalUser localUser  = JSONUtil.toBean(JWTUtil.parseToken(token).getPayload().toString(),LocalUser.class);
                List<GrantedAuthority> grantedAuthorities = new ArrayList<>();
                String[] roles = localUser.getRoles();
                for (String role : roles) {
                    //ROLE_ 一定要加上,否则会报错,它是为了兼容老的规则
                    grantedAuthorities.add(new SimpleGrantedAuthority("ROLE_"+role));
                }
                UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(
                        localUser.getId(), // 用户名
                        "",
                        grantedAuthorities
                        ); // 角色列表
                SecurityContextHolder.getContext().setAuthentication(authentication);
            }

            chain.doFilter(request, response);
        }
    }
}

验证

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JavaWeb06-MVC和三层架构

目录 一、MVC模式 1.概述 2.好处 二、三层架构 1.概述 三、MVC与三层架构 四、练习 一、MVC模式 1.概述 MVC是一种分层开发的模式&#xff0c;其中 M&#xff1a;Model&#xff0c;业务模型&#xff0c;处理业务 V&#xff1a; View&#xff0c;视图&#xff0c;界面展…

雅特力AT32A403开发板评测 01 开箱及环境搭建流程

01-雅特力AT32A403A开发板开箱及环境搭建流程 雅特力AT32 2023年&#xff0c;玩了不少的国产MCU开发板&#xff0c;例如武汉芯源CW32&#xff0c;兆易创新GD32、上海航芯ACM32、沁恒CH32V307等开发板&#xff0c;虽然电子工程世界论坛也有雅特力AT32开发板的评测活动&#xf…

NO5 蓝桥杯实践之矩阵键盘的使用(或许是一篇求助帖...)

1 任务 2 思路 视频中老师的思路写的代码过长&#xff0c;所以我想了个自己的思路&#xff0c;但是没完全跑出来&#xff0c;求大神指教&#xff01;&#xff01;&#xff01;&#xff01; 我的思路是首先将矩阵键盘的行和列对应的端口引脚分别存储在类似数组&#xff0c;然后…

人工智能|机器学习——BIRCH聚类算法(层次聚类)

这里再来看看另外一种常见的聚类算法BIRCH。BIRCH算法比较适合于数据量大&#xff0c;类别数K也比较多的情况。它运行速度很快&#xff0c;只需要单遍扫描数据集就能进行聚类。 1.什么是流形学习 BIRCH的全称是利用层次方法的平衡迭代规约和聚类&#xff08;Balanced Iterative…

环形缓冲区在stm32上的使用

目录 环形缓冲区在stm32上的使用前言实验目的环形缓冲区的定义和初始化写入数据到环形缓冲区从环形缓冲区读取数据实验结果本文中的实践工程 环形缓冲区在stm32上的使用 本文目标&#xff1a;环形缓冲区在stm32上的使用 按照本文的描述&#xff0c;应该可以跑通实验并举一反三…

利用Anaconda创建环境

利用Anaconda创建环境 1. 创建环境的步骤 1. 创建环境的步骤 1.在终端中&#xff0c;使用以下命令创建一个新的 Anaconda 环境。假设您想要创建一个名为 myenv 的环境&#xff1a; conda create --name myenv2.如果您想指定 Python 版本&#xff0c;可以在创建环境时添加版本号…

AI论文速读 | 计时器(Timer):用于大规模时间序列分析的Transformer

题目&#xff1a; Timer: Transformers for Time Series Analysis at Scale 作者&#xff1a;Yong Liu,&#xff08;刘雍&#xff09;, Haoran Zhang&#xff08;张淏然&#xff09;, Chenyu Li&#xff08;李晨宇&#xff09;, Jianmin Wang&#xff08;王建民&#xff09;, …

群晖 Synology Photos DSM7 自定义文件夹管理照片

背景 众所周知&#xff0c;目前群晖DSM7中使用Synology Photos做照片管理时&#xff0c;个人照片只能默认索引 /home/Photos 文件夹&#xff0c;但是如果个人照片很多或者用户很多时&#xff0c;共享文件夹/homes 所在的存储空间就会不够用 当然&#xff0c;如果你的存…

【软考高项】四、信息化发展之数字中国

1、数字经济 定义&#xff1a;从本质上看&#xff0c;数字经济是一种新的技术经济范式&#xff0c;它建立在信息与通信技术的重大突破的基础上&#xff0c;以数字技术与实体经济融合驱动的产业梯次转型和经济创新发展的主引擎&#xff0c;在基础设施、生产要素、产业结构和治理…

certificate has expired or is not yet valid:npm和node证书过期问题

在 1 月 22 日&#xff0c;淘宝原镜像域名&#xff08;registry.npm.taobao.org&#xff09;的 HTTPS 证书正式到期。如果想要继续使用&#xff0c;需要将 npm 源切换到新的源&#xff08;registry.npmmirror.com&#xff09;&#xff0c;否则会报错。 解决方案切换到新的源&a…

nacos做注册注册中心go语言实战教程(服务的注册与获取)

背景 随着访问量的逐渐增大&#xff0c;单体应用结构渐渐不满足需求&#xff0c;在微服务出现之后引用被拆分为一个个的服务&#xff0c;服务之间可以互相访问。初期服务之间的调用只要知道服务地址和端口即可&#xff0c;而服务会出现增减、故障、升级等变化导致端口和ip也变…

欧科云链做客Google Cloud与WhalerDAO专题论坛,畅谈Web3数据机遇

3月10日&#xff0c;由Google Cloud、WhalerDAO和baidao data主办&#xff0c;以Web3AI 2024 DATA POWER为主题的分享会在北京中关村举行。欧科云链高级研究员Jason Jiang受邀参加活动&#xff0c;带来“从链上数据发掘Web3时代的无限机遇”的主题分享。 Web3.0核心要素始终是链…

如何从 Mac 电脑外部硬盘恢复删除的数据文件

本文向您介绍一些恢复 Mac 外置硬盘数据的快速简便的方法。 Mac 的内部存储空间通常不足以存储所有数据。因此&#xff0c;许多用户通过外部驱动器扩展存储或创建数据备份。然而&#xff0c;与几乎所有其他设备一样&#xff0c;从外部硬盘驱动器丢失有价值的数据并不罕见。由于…

第二证券|炒股最好用的6个指标?

炒股存在以下好用的6个目标&#xff1a; 1、kdj目标 当k线从下方往上穿过d线时&#xff0c;构成金叉&#xff0c;是一种买入信号&#xff0c;投资者能够考虑在此刻买入一些个股&#xff0c;其间kdj金叉方位越低&#xff0c;买入信号越强&#xff1b;当k线从上往下穿过d线时&a…

HTML静态网页成品作业(HTML+CSS)——电影肖申克的救赎介绍设计制作(1个页面)

&#x1f389;不定期分享源码&#xff0c;关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 &#x1f3f7;️本套采用HTMLCSS&#xff0c;未使用Javacsript代码&#xff0c;共有1个页面。 二、作品演示 三、代…

“SRP模型+”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程

原文链接&#xff1a;“SRP模型”多技术融合在生态环境脆弱性评价模型构建、时空格局演变分析与RSEI 指数的生态质量评价及拓展应用教程https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247597452&idx5&snf723d9e5858a269d00e15dbe2c7d3dc0&chksmfa823c6…

Python算法(列表排序)

一。冒泡排序&#xff1a; 列表每两个相邻的数&#xff0c;如果前面比后面大&#xff0c;则交换这两个数 一趟排序完成后&#xff0c;则无序区减少一个数&#xff0c;有序区增加一个数 时间复杂度&#xff1a;O(n*n) 优化后&#xff1a;已经排序好后立马停止&#xff0c;加快…

Ubuntu 14.04:PaddleOCR基于PaddleHub Serving的服务部署(失败)

目录 一、为什么使用一键服务部署 二、安装 paddlehub 1.8 2.1 安装前的环境准备 2.2 安装paddlehub 1.8 2.2.1 安装paddlehub 2.2.2 检测安装是否成功 2.2.3 检查本地与远端PaddleHub-Server的连接状态 2.2.4 测试使用 2.3 其他 2.3.1 如何卸载、pip常用命令、常见…

FPGA高端项目:FPGA基于GS2971+GS2972架构的SDI视频收发+HLS图像缩放+多路视频拼接,提供4套工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐本博已有的 SDI 编解码方案本方案的SDI接收发送本方案的SDI接收图像缩放应用本方案的SDI接收纯verilog图像缩放纯verilog多路视频拼接应用本方案的SDI接收OSD动态字符叠加输出应用本方案的SDI接收HLS多路视频融合叠加应用本方案的SDI接收G…

Pandas DataFrame 写入 Excel 的三种场景及方法

一、引言 本文主要介绍如何将 pandas 的 DataFrame 数据写入 Excel 文件中&#xff0c;涉及三个不同的应用场景&#xff1a; 单个工作表写入&#xff1a;将单个 DataFrame 写入 Excel 表中&#xff1b;多个工作表写入&#xff1a;将多个 DataFrame 写入到同一个 Excel 表中的…