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

简介: 本文深入分析Spring Security认证流程源码,从UsernamePasswordAuthenticationFilter到AuthenticationManager、AbstractUserDetailsAuthenticationProvider,解析认证核心机制。结合自定义UserDetailService实现与SecurityConfig配置,手把手实现数据库认证逻辑,助力掌握安全框架的定制化开发。

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

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

运行代码复制代码

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

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);

}

}

改完的效果如下图

INPORTORG,SPRINGFRAMEWORK,SECURITY,CONFIGANNOTATION.WEB,CONFIGUNATIONWEBSEEUTE

IMPORTORG,SPRINGFRANEWONK.SECUNITY,CONFIG,ANNOTATION.WEB.BUILDENS.HTTPSECUFITY;

IMPONTONG,SPRINGFRANEWONK.SECUNITY.CONFIG.ANNOTATION.AUTHENTICATION.BUILDERS,AUTHENTI

MPOPTORGSPRINGFRAMEWORK,CONTEXT.ANNOTATION.CONF1GURATION;

PROTECTEDVOIDCONFIGURE(HTTPSECURITYHTTP)THROWSEXCEPTION

,AND().FORNLOGIN().LOGINPAGE("/LOGIN.HTML")FORMLOGINCONFIGURER<HTPSECURITY

HTP.AUTHORIZEREQUESTS)EXPRESSIONUNLAUTHORIZATIONCONFQURER<H-.EXPRESSIONLNTERCEPURLREGISTRY

PROTECTEDVOIDCONFIQURE(AUTHENTICATIONMANAGQERBUILDERAUTH)

PUB1ICCLASSSECURITYCONF1GEXTENDSWEBSEEUP1TYGENF1FUPEPADAPTEP

AUTH.USERDETAILSSERVICE(MYUSERSERVICE);

IMPONTCON,YZXB.SPRINGSECURITY.SERVICE.MYUSERSERVLCE

IMPORTJAVAXANNOTATIONRESOURCE

PRIVATEMYUSERSERVICEMYUSERSERVICEI

,ANVREGUEST().AUTHENTICATED()

SPRINGSECURITYD:LWORKLWORKSPACELMELSPRIN

CSF()CSRFCONFIGURER<HTPSE

DEFAULTSUCCESSURL("/DEMO/INDEX

1OGINPROCESSINGURL"/DOLOGIN)

PACKAGECOM.YZXB.SPRINGSECURITY.CONFIG;

.USERNAMEPARAMETER(UNAME")

COMYZXBSPRINGSECURITY

ERBUILDERAUTH)THROWSEXCEPTION

.PASSWORDPARAMETER("PASS

三一G一CSECURITYCONFIGJAVE

OSCRATCHESANDCONSOLE

.FAILUREURL("/LOGIN.HTML")

CSPRINGSECURITYAPPLICATION

LEXTERNALLIBRARIES

ACONFIAURATION

TION.BUILDERS.AUTHENTICATIONMANAGERBU1L

RESOURCES

SPRINGSECURITY.IM

AND)HTTPSECURITY

CSECURITYCONFIG

.DISABLEG);

LOGIN.HTML

AOVERRIDE

CMYUSERSERVICE

VSTATIC

ASERVICE

VBCONFIG

SHELPMD

PERMITALLO)

MPOM.XML

MAIN

QOVERRIDE

VDPOJO

口PROJECT

8EF@白

CROLE

GRESOURCE

>TEST

CUSER

152

WEB

TARGET

JAVA

12信

13

ET@

>JIDEA

11

30

28

29

27

17

28

16

..,..14

SRC

1日

9

20

IAURATION.WEBSEEUPTYCEHF9UPE

19


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

若有收获,就点个赞吧


相关文章
|
6月前
|
Web App开发 供应链 数据可视化
快递地图轨迹-快递物流轨迹地图-物流信息可视化API接口的运用
快递物流轨迹地图API,支持顺丰、中通、圆通等600+快递公司,在APP中直观展示实时物流轨迹,提升用户体验。提供标准化接口,含运单查询、手机号校验、排序等参数,返回高可用地图链接。
1158 2
快递地图轨迹-快递物流轨迹地图-物流信息可视化API接口的运用
|
数据采集 人工智能 API
【实战技巧】DeepSeek 手机版表格导出全攻略:从“复制乱码”到“一键转Excel”的终极解决方案
DeepSeek生成表格后导出难?本文详解三大实用方法:1)原生复制法,一键粘贴至WPS/飞书自动识别;2)第三方工具,秒转Excel或高清长图;3)开发者可用API+Python批量自动化处理。适配不同场景,助你高效办公,建议收藏!
4906 0
【实战技巧】DeepSeek 手机版表格导出全攻略:从“复制乱码”到“一键转Excel”的终极解决方案
|
6月前
|
前端开发
前端开发 之 15个炫酷按钮特效上【附完整源码】
本篇文章内容展示了灯光效果按钮、拉链式展开按钮、毛玻璃式按钮等众多炫酷按钮特效,并给出了完整代码及注释
588 6
|
9月前
|
JSON 安全 机器人
钉钉通知
本文介绍如何通过Java代码调用钉钉机器人API实现系统告警消息推送。内容涵盖机器人创建、Webhook配置、Postman测试及Java代码实现,并提供限流策略与关键词安全设置等最佳实践,助力实时监控与异常通知。
|
9月前
|
数据采集 领域建模 数据库
领域模型图(数据架构/ER图)
本文介绍如何通过四色原型法构建领域模型,并逐步推导出数据架构中的ER图。采用红色(时标性)、绿色(参与方-物品-地点)、黄色(角色)和蓝色(描述)四色模型,结合风控系统案例,详解从业务流程到实体关系图的建模过程,助力精准梳理数据结构。
 领域模型图(数据架构/ER图)
|
9月前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
9月前
|
安全 Java 应用服务中间件
4.认识SpringSecurity
Spring Security 是 Spring 生态中的安全框架,提供认证、授权及安全防护功能。支持多种认证方式(如表单、OAuth2、JWT等),基于过滤器链实现请求控制,可防御 CSRF 等攻击,保障 Web 应用安全。
|
存储 算法 Android开发
AVB校验微观版本:android avb(Android Verified Boot)验证
AVB校验微观版本:android avb(Android Verified Boot)验证
2978 0
|
存储 网络协议 物联网
C 语言物联网开发之网络通信与数据传输难题
本文探讨了C语言在物联网开发中遇到的网络通信与数据传输挑战,分析了常见问题并提出了优化策略,旨在提高数据传输效率和系统稳定性。
|
数据可视化
QChart多个图布局使坐标轴对齐的方法
QChart多个图布局使坐标轴对齐的方法
792 0

热门文章

最新文章