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

简介: 本文深入分析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-用户自定义认证

若有收获,就点个赞吧


相关文章
|
2天前
|
uml C语言
系统时序图
时序图(Sequence Diagram)是UML中描述对象间消息传递时间顺序的交互图,横轴为对象,纵轴为时间。它用于展示系统动态协作过程,强调交互的时间先后关系,直观呈现并发行为。主要元素包括角色、对象、生命线、控制焦点和消息等,广泛应用于软件设计建模。
系统时序图
|
2天前
|
消息中间件 存储 数据挖掘
应用架构图
本文介绍应用架构图的设计原理,涵盖单体与分布式架构模式。重点解析展现层、业务层、数据层及基础通用层的分层设计,阐述系统间调用关系与外部依赖,明确应用边界,指导技术方案落地。
|
2天前
|
消息中间件 运维 物联网
语音通知
语音通知服务适用于科技公司服务器或物联网设备异常时的告警通知。通过语音电话形式,向处理人播报预设模板内容,支持变量替换实现个性化提醒。需开通语音服务并申请资质、话术、号码及模板,可通过API发起呼叫并查询记录,支持主动查询与消息回执两种结果获取方式,提升运维响应效率。
语音通知
|
1天前
|
项目管理 开发者
业务架构图
业务架构图是梳理业务层级与关系的工具,通过分层、分模块、分功能,抽象出业务核心结构,明确各部分职责与协作,服务于客户理解与系统开发,是连接业务与技术的重要桥梁。
Day07
简介:本文讲解CAP与BASE理论核心要点,阐述分布式系统中一致性、可用性与分区容错性的权衡,解析Seata AT模式的执行流程,并探讨MQ消息防丢失、重复消费及积压处理等关键问题。
Day07
|
1天前
|
运维 Devops 开发工具
生产环境缺陷管理
针对大型团队多分支开发中bug管理难题,本文介绍基于go-git实现的分布式工具git-poison,通过“投毒-解药-银针”机制,实现bug的自动化追溯、发布卡点与影响范围精准识别,有效避免人为疏漏导致的生产事故,提升缺陷管理效率与系统稳定性。
生产环境缺陷管理
|
1天前
|
Dubbo Java 应用服务中间件
Day02
Day02:掌握Spring Cloud Gateway原理,基于Netty实现非阻塞请求转发;项目采用OpenFeign进行远程调用;深入JVM模型、垃圾回收、类加载及调优。
Day02
|
1天前
|
负载均衡 Dubbo 应用服务中间件
Day01
本文介绍微服务架构的适用场景及技术选型,对比单体与微服务优劣,详解Nacos与Eureka注册中心的心跳机制、服务治理差异,并涵盖常见负载均衡算法及SpringCloud Alibaba常用组件实践。
 Day01
|
1天前
|
存储 安全 算法
第一章 Java基础
本章系统讲解Java基础核心知识,涵盖重载与重写、==与equals、String三兄弟区别、异常体系、集合类原理(如HashMap结构与扩容)、线程并发(ThreadLocal、锁机制)、JVM内存模型、Lambda表达式、反射泛型及Tomcat优化等内容,深入浅出,助力夯实Java基础。
第一章 Java基础
|
1天前
|
存储 缓存 Java
自定义注解
本文介绍Java自定义注解的实现原理与应用,结合Spring AOP 和过滤器实现日志、权限控制及登录验证,涵盖注解定义、@Target、@Retention等核心语法,并通过代码示例展示实际使用流程。
 自定义注解