当前位置:

首页 > 编程开发 > SpringSecurity+Redis认证过程是怎样的

SpringSecurity+Redis认证过程是怎样的

Redis Assistant
Redis Assistant

Redis Assistant 是一款为Redis设计的高效可视化管理与监控工具,提供多种操作模式,高效处理服务器数据。日常使用里的持续防护和信息管理会更突出,适合把安全控制放进长期使用流程中的场景。

立即下载
¥19
Windows/macOS/Linux 2026-08-17
正版软件 Windows macOS软件 Linux 数据库管理工具
本文目录

    前言引入当今市面上用于权限管理的流行的技术栈组合是ssm+shrioSpringCloud+SpringBoot+SpringSecurity这种搭配自然有其搭配的特点,由于SpringBoot的自动注入配置原理,在创建项目时就自动注入管理SpringSecurity的过滤器容器(DelegatingFilterProxy),而这个过滤器是整个SpringSercurity的核心。掌握着SpringSercurity整个权限认证过程,而SpringBoot很香的帮你将其自动注入了,而用ssm去整合Secu

    前言引入

    当今市面上用于权限管理的流行的技术栈组合是

    • ssm+shrio

    • SpringCloud+SpringBoot+SpringSecurity

    SpringSecurity+Redis认证过程是怎样的

    这种搭配自然有其搭配的特点,由于SpringBoot的自动注入配置原理,在创建项目时就自动注入管理SpringSecurity的过滤器容器(DelegatingFilterProxy),而这个过滤器是整个SpringSercurity的核心。掌握着SpringSercurity整个权限认证过程,而SpringBoot很香的帮你将其自动注入了,而用ssm
    去整合Security,将会耗用大量的配置文件,不易于开发,而Security的微服务权限方案,更是能和Cloud完美融合,于是Security比Shrio更强大,功能更齐全。

    Security的核心配置文件

    核心:Class SecurityConfig extends WebSecurityConfigurerAdapter

    继承了WebSecurityConfigurerAdapter后我们关注于configure方法对于在整个安全认证的过程进行相关的配置,当然在配置之前我们先简单了解一下流程

    简单的看了整个权限认证的流程,很轻易的总结得出,SpringSecurity核心的就是以下几种配置项了

    • 拦截器(Interceptor)

    • 过滤器(Filter)

    • 处理器(Handler,异常处理器,登录成功处理器)

    那我们就首先通过配置来完成认证过程吧!!!!

    Security的认证过程

    假设我们要实现一下的认证功能

    1. 是登录请求

    • 我们需要先判断验证码是否正确(验证码过滤器,通过addFilerbefore实现前置拦截)

    • 再判断用户名密码是否正确(使用自带的用户名密码过滤器,UsernamePasswordAuthenticationFilter)

    • 配置异常处理器(Handler)通过IO流将异常信息写出

    关于密码校验的流程:
    UsernamePasswordAuthenticationFilter的密码校验规则是基于AuthenticationManagerBuilder(认证管理器)下的 UserDetailsService里的规则进行验证的:
    其中的核心方法:

    1.public UserDetails *loadUserByUsername(String username)
    通过请求参数的用户名去数据库查询是否存在,存在则将其封装在UserDetails里面,而验证过程是通过AuthenticationManagerBuilder获取到UserDetail里的username和password来校验的,
    这样我们就可以通过

    • 配置yaml文件设置账号密码

    • 通过数据库结合UserDetail来设置账号密码

    (UserDetailsService中的方法,注意需要将UserDetailsService注入AuthenticationManagerBuilder中)

    	@Override
    	public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
    		SysUser sysUser = sysUserService.getByUsername(username);
    		if (sysUser == null) {
    			throw new UsernameNotFoundException("用户名或密码不正确");
    		}
    		// 注意匹配参数,前者是明文后者是暗纹
    		System.out.println("是否正确"+bCryptPasswordEncoder.matches("111111",sysUser.getPassword()));
    		return new AccountUser(sysUser.getId(), sysUser.getUsername(), sysUser.getPassword(), getUserAuthority(sysUser.getId()));
    	}

    通过了这个验证后,过滤器放行,不通过就用自定义或者默认的处理器处理

    核心配置文件:

    package com.markerhub.config;
    
    import com.markerhub.security.*;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
    import org.springframework.security.config.annotation.method.configuration.EnableGlobalMethodSecurity;
    import org.springframework.security.config.annotation.web.builders.HttpSecurity;
    import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
    import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
    import org.springframework.security.config.http.SessionCreationPolicy;
    import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
    import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
    
    @Configuration
    @EnableWebSecurity
    @EnableGlobalMethodSecurity(prePostEnabled = true)
    public class SecurityConfig extends WebSecurityConfigurerAdapter {
    
    	@Autowired
    	LoginFailureHandler loginFailureHandler;
    
    	@Autowired
    	LoginSuccessHandler loginSuccessHandler;
    
    	@Autowired
    	CaptchaFilter captchaFilter;
    
    	@Autowired
    	JwtAuthenticationEntryPoint jwtAuthenticationEntryPoint;
    
    	@Autowired
    	JwtAccessDeniedHandler jwtAccessDeniedHandler;
    
    	@Autowired
    	UserDetailServiceImpl userDetailService;
    
    	@Autowired
    	JwtLogoutSuccessHandler jwtLogoutSuccessHandler;
    
    	@Bean
    	JwtAuthenticationFilter jwtAuthenticationFilter() throws Exception {
    		JwtAuthenticationFilter jwtAuthenticationFilter = new JwtAuthenticationFilter(authenticationManager());
    		return jwtAuthenticationFilter;
    	}
    
    	@Bean
    	BCryptPasswordEncoder bCryptPasswordEncoder() {
    		return new BCryptPasswordEncoder();
    	}
    
    	private static final String[] URL_WHITELIST = {
    
    			"/login",
    			"/logout",
    			"/captcha",
    			"/favicon.ico",
    
    	};
    
    
    	protected void configure(HttpSecurity http) throws Exception {
    
    		http.cors().and().csrf().disable()
    
    				// 登录配置
    				.formLogin()
    				.successHandler(loginSuccessHandler)
    				.failureHandler(loginFailureHandler)
    
    				.and()
    				.logout()
    				.logoutSuccessHandler(jwtLogoutSuccessHandler)
    
    				// 禁用session
    				.and()
    				.sessionManagement()
    				.sessionCreationPolicy(SessionCreationPolicy.STATELESS)
    
    				// 配置拦截规则
    				.and()
    				.authorizeRequests()
    				.antMatchers(URL_WHITELIST).permitAll()
    				.anyRequest().authenticated()
    
    				// 异常处理器
    				.and()
    				.exceptionHandling()
    				.authenticationEntryPoint(jwtAuthenticationEntryPoint)
    				.accessDeniedHandler(jwtAccessDeniedHandler)
    
    				// 配置自定义的过滤器
    				.and()
    				.addFilter(jwtAuthenticationFilter())
    				.addFilterBefore(captchaFilter, UsernamePasswordAuthenticationFilter.class)
    
    		;
    
    	}
    
    	@Override
    	protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    		auth.userDetailsService(userDetailService);
    	}
    }

    2. 不是登录请求

    • 通过JwtfFilter来查看是否为登录状态

    使用Redis整合时的注意事项

    本质上还是编写过滤器链:

    • 在登录请求前添加过滤器

    • 注意验证码存储在redis的失效时间,如果超过失效时间将会被验证码拦截器拦截下来

    • 需要准备一个生成验证码的接口,存储在Redis中

    • 使用完验证码需要将其删除

    // 校验验证码逻辑
    	private void validate(HttpServletRequest httpServletRequest) {
    
    		String code = httpServletRequest.getParameter("code");
    		String key = httpServletRequest.getParameter("token");
    
    		if (StringUtils.isBlank(code) || StringUtils.isBlank(key)) {
    			System.out.println("验证码校验失败2");
    			throw new CaptchaException("验证码错误");
    		}
    
    		System.out.println("验证码:"+redisUtil.hget(Const.CAPTCHA_KEY, key));
    		if (!code.equals(redisUtil.hget(Const.CAPTCHA_KEY, key))) {
    			System.out.println("验证码校验失败3");
    			throw new CaptchaException("验证码错误");
    		}
    
    		// 一次性使用
    		redisUtil.hdel(Const.CAPTCHA_KEY, key);
    	}
    本文内容来源于网友投稿,如有侵权请联系删除。
    作者最新文章
    编程开发
    相关文章 更多
    链表删除节点的时间复杂度是多少及其详细分析
    链表删除节点的时间复杂度是多少及其详细分析

    详细分析链表删除节点的时间复杂度,深入探讨单链表与双向链表在不同已知前提下的查找与删除开销,并结合完整代码与清晰图解进行对比总结。

    codex如何配置模型参数及文件设置教程
    codex如何配置模型参数及文件设置教程

    想知道如何让AI写出的代码更贴合你的习惯?本文手把手教你在VS Code中调整Codex相关模型参数,通过修改配置文件优化温度值和令牌限制,解决代码建议不准确或响应慢的问题。

    Claude Code AI编程工具实力揭秘与编程助手实测
    Claude Code AI编程工具实力揭秘与编程助手实测

    通过实测展示Claude Code在终端中如何理解自然语言指令、自动修改代码文件并处理复杂编程任务,帮助开发者评估其实际辅助能力。

    winforms教程自学入门与基础开发步骤详解
    winforms教程自学入门与基础开发步骤详解

    本教程详细讲解如何使用Visual Studio创建WinForms项目,通过添加按钮和标签控件并编写点击事件代码,实现一个基础的计数器功能,适合C#初学者快速上手Windows窗体应用开发。

    Cursor自动补全设置教程教你快速开启代码补全功能
    Cursor自动补全设置教程教你快速开启代码补全功能

    详解Cursor编辑器中自动补全功能的开启与优化设置,涵盖Tab触发机制、上下文窗口调整及模型切换,帮助开发者解决补全延迟、干扰大等问题,提升编码流畅度。

    pandas的数据格式怎么转换和设置方法教程
    pandas的数据格式怎么转换和设置方法教程

    详解Pandas中数据格式转换的核心方法,包括astype强制转换、to_numeric容错处理及日期解析技巧,解决常见类型错误并提升数据处理效率。

    VS Code中文设置方法 简体语言包安装与切换教程
    VS Code中文设置方法 简体语言包安装与切换教程

    详细介绍在Visual Studio Code中安装Chinese (Simplified)语言包的方法,包括通过扩展市场搜索、安装及自动重启切换至简体中文界面的完整步骤,帮助开发者快速将编辑器本地化。

    cursor安装过程无法更改安装位置的解决方法
    cursor安装过程无法更改安装位置的解决方法

    针对Cursor安装包默认锁定C盘且无路径选择界面的问题,提供通过手动移动文件并创建目录联结(Symbolic Link)的解决方案,实现将软件安装在其他磁盘分区。

    rust下载安装教程详解及Windows环境配置方法
    rust下载安装教程详解及Windows环境配置方法

    详解Windows系统下Rust语言的安装步骤,重点解析rustup工具链管理机制,解决环境变量配置错误及MSVC链接器缺失问题,提供可复制的命令验证方法与常见报错的因果排查思路。

    vs code怎么配置 chat实用设置教程步骤
    vs code怎么配置 chat实用设置教程步骤

    详解VS Code中Chat插件的安装与核心配置步骤,重点解决API连接失败、响应慢等常见问题,通过优化上下文设置提升代码生成质量,适合希望集成AI辅助工具的开发者阅读。

    查看更多
    精品专题 更多
    装机必备
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows
    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    macOS软件
    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    Mac软件 更多
    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    灵活计算器
    灵活计算器
    macOS/iOS/Android

    灵活计算器是一款笔记式算数应用,支持实时计算、动态关联和云端同步功能。记录、整理和输出之间的过渡会更自然,适合长期写作、做笔记或持续沉淀个人内容。

    WINDOWS 更多
    3dmax(3ds max)
    3dmax(3ds max)
    Windows

    Autodesk 3ds Max 是一款专业的三维建模、动画与渲染软件,广泛应用于建筑可视化、游戏开发、影视动画、广告设计和产品展示等领域。

    photoshop
    photoshop
    Windows、macOS 、 iPad

    Photoshop 2026 是 Adobe 推出的专业图像处理与视觉设计软件,支持 Windows、macOS 和 iPad 等平台,广泛应用于摄影修图、电商设计、平面海报、数字绘画及视觉合成等创作场景。

    Blender
    Blender
    Windows、macOS 和 Linux

    Blender 是一款免费开源、跨平台的专业 3D 创作软件,集建模、动画、渲染、视频编辑与视觉合成等功能于一体,广泛应用于影视动画、游戏设计和建筑可视化等领域。软件支持 Cycles 物理渲染器与 Eevee 实时渲染引擎,并提供多边形建模、骨骼绑定、物理模拟等专业工具。Blender 兼容 Windows、macOS 和 Linux 系统,安装包轻巧、运行流畅,依托活跃的全球开发者社区持续更新,是从初学者到专业创作者都值得选择的正版 3D 创作工具。

    即将离开本站
    您即将前往第三方网站,请确认是否继续?