认证源码分析与自定义后端认证逻辑

简介: 本文深入分析Spring Security认证流程,从UsernamePasswordAuthenticationFilter到AuthenticationManager、AbstractUserDetailsAuthenticationProvider,层层解析认证机制。重点讲解自定义UserDetailService实现、权限封装及Security配置,结合源码与实践,帮助开发者掌握自定义数据库认证逻辑的完整实现,并提供GitHub代码仓库供学习参考。

1.认证流程分析
UsernamePasswordAuthenticationFilter
先看主要负责认证的过滤器UsernamePasswordAuthenticationFilter,有删减,注意注释。
AuthenticationManager
由上面源码得知,真正认证操作在AuthenticationManager里面!
AbstractUserDetailsAuthenticationProvider
咱们继续再找到AuthenticationProvider的实现类AbstractUserDetailsAuthenticationProvider:
AbstractUserDetailsAuthenticationProvider
按理说到此已经知道自定义认证方法的怎么写了,但咱们把返回的流程也大概走一遍,上面不是说到返回了一个 UserDetails对象对象吗?
跟着它就又回到AbstractUserDetailsAuthenticationProvider对象中authenticate方法最后一行了。
UsernamePasswordAuthenticationToken
来到UsernamePasswordAuthenticationToken对象发现里面有两个构造方法
AbstractAuthenticationToken
再点进去super(authorities)看看:
由此,咱们需要牢记自定义认证业务逻辑返回的UserDetails对象中一定要放置权限信息! 现在可以结束源码分析了?先不要着急! 咱们回到最初的地方UsernamePasswordAuthenticationFilter,你看好看了,这可是个过滤器,咱们分析这么 久,都没提到doFilter方法,你不觉得心里不踏实?可是这里面也没有doFilter呀?那就从父类找!
AbstractAuthenticationProcessingFilter
点开AbstractAuthenticationProcessingFilter,删掉不必要的代码!
可见AbstractAuthenticationProcessingFilter这个过滤器对于认证成功与否,做了两个分支,成功执行 successfulAuthentication,失败执行unsuccessfulAuthentication。
在successfulAuthentication内部,将认证信息存储到了SecurityContext中。并调用了loginSuccess方法,这就是常见的“记住我”功能!此功能具体应用,咱们后续再研究!
2.自定义认证实现流程
1.实现UserDetailService与自定义逻辑
自定义用户类需要实现UserDetails接口,并实现接口的方法,所以我们编写下述代码。
2.注册自定义实现类
Java
运行代码
复制代码

package com.yzxb.SpringSecurity.config;

import com.yzxb.SpringSecurity.service.MyUserService;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

import javax.annotation.Resource;

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Resource
private MyUserService myUserService;

@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
            .anyRequest().authenticated()
            .and().formLogin().loginPage("/login.html")
            .loginProcessingUrl("/doLogin")
            .defaultSuccessUrl("/demo/index ")
            .failureUrl("/login.html")
            .usernameParameter("uname")
            .passwordParameter("passwd")
            .permitAll()
            .and()
            .csrf()
            .disable();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
    auth.userDetailsService(myUserService);
}

}
改完的效果如下图
然后重启项目,就可以实现自定义的数据库认证逻辑。
3.完整代码获取
git仓库地址:https://github.com/Herbbbb/SpringSecurity.git
分支名称:Day02-用户自定义认证

相关文章
|
2天前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。它用于展示对象协作过程,强调交互时序,直观表达并发行为。主要元素包括角色、对象、生命线、控制焦点和各类消息,支持同步、异步与返回消息,适用于系统动态建模。
|
2天前
|
SQL 存储 关系型数据库
慢SQL说起:淘天交易订单表如何做索引优化
本文以淘天电商订单表一条非典型慢SQL为切入点,系统剖析了索引优化理论与实践。内容涵盖B+Tree与B-Tree结构差异、索引下推、排序机制、EXPLAIN与Query Profile等诊断工具使用,并结合大规模线上集群经验,总结慢SQL常见成因及治理策略,提出标准化索引变更SOP,助力高效稳定数据库性能优化。
|
2天前
|
负载均衡 算法 搜索推荐
重复性工作中如何培养匠心
本文探讨在互联网低增长周期下,如何在重复性工作中培养“匠心”。通过分析结果价值、过程贡献度与可预测性三个维度,指出即便工作看似重复,仍可通过创新、沉淀与自我突破挖掘成长空间,实现从熟练到卓越的跃迁。
|
2天前
|
监控 Java 测试技术
OOM排查之路:一次曲折的线上故障复盘
本文记录了一次线上服务因Paimon数据湖与RocksDB集成引发的三次内存溢出(OOM)故障排查全过程。通过MAT、NMT、async-profiler等工具,结合监控分析与专家协作,最终定位到RocksDB通过JNI申请的堆外内存未释放是根源。团队通过架构优化,改由Flink统一写入Paimon,彻底解决问题。文章系统梳理了排查思路与工具使用,为类似技术栈提供宝贵经验。
|
2天前
|
安全
通过述职发现自己"变"了
本文从技术研发视角解读述职的本质,强调其不仅是总结工作,更是展现个人成长与价值创造的过程。通过结构化思考、快慢思维结合、积极主动、以终为始等做事方法,提升执行力与影响力,实现有质量的结果输出。同时倡导深度反思与有效沟通,借事修人,推动持续成长。
|
2天前
|
敏捷开发 Dubbo Java
需求开发人日评估
随着敏捷开发普及,工时评估成关键。本文介绍人日概念及开发、自测、联调、测试、发布各阶段评估方法,提供常见需求如增删改查、导入导出、跨服务调用等参考人日,助力团队科学规划迭代周期。
|
2天前
|
测试技术
发布模式
蓝绿部署通过两套并行系统(绿色为现役,蓝色为待发布)实现零停机发布与快速回滚。新版本在蓝色环境测试验证后,流量切换至蓝色系统,稳定运行后其转为新的绿色系统。该策略适用于内聚性强、易于切换的系统,不适用于复杂耦合场景。
|
2天前
|
运维 Kubernetes Java
物理部署图
物理部署图描述系统运行时的硬件配置与软件部署结构,展现节点、构件、物件及连接关系,常用于理解分布式系统。它从运维视角出发,揭示应用如何在硬件上运行,是开发与运维协同的重要设计工具。
|
2天前
|
SQL 运维 分布式计算
如何做好SQL质量监控
SLS推出用户级SQL质量监控功能,集成于CloudLens for SLS,提供健康分、服务指标、运行明细、SQL Pattern分析及优化建议五大维度,帮助用户全面掌握SQL使用情况,精准识别高耗能业务,提升查询效率与资源管理水平。
|
2天前
|
前端开发 API 数据库
如何写好一篇技术方案
本文档为项目需求说明模板,涵盖背景目标、功能模块、流程图、UML设计、API与数据库设计等内容,支持表格、思维导图、时序图等多种视图,便于团队协作与排期管理,提升产研效率。