spring Security 认证流程分析|学习笔记

简介: 快速学习 spring Security 认证流程分析

开发者学堂课程【Spring Security知识精讲与实战演示(一)spring Security认证流程分析】学习笔记与课程紧密联系,让用户快速学习知识

课程地址https://developer.aliyun.com/learning/course/730/detail/13037


spring Security 认证流程分析

 

认证的底层流程。认证已经做完,为什么需要梳理流程。需要注意的一个问题是,当我们点开配置文件,里面认证用的用户名和密码写到了内存中。在实际开发中,认证是不可以直接把用名和密码写到内存中的。应该用自己数据库中的用户名和密码,当要用数据库中的用户名和密码,login.jsp中的login并不是我们写的,别人提供的认证处理器不知道我们的用户,不知道里面的内容。所以当想用它的处理器,又想用我们自己的数据时,可以分析一下流程,找到处理器里边真正处理登陆操作,即认证操作的业务逻辑,然后再进行梳理业务逻辑。

它如何写,我们也写一套类似的,让它用我们自己写的那套,流程就可以走通了。此时,我们分析一下 Spring Security 的认证流程,UsernamePasswordAuthenticationFilterI,这是认证的一个过滤器,真正的认证业务是靠这个过滤器去完成的。

当我们想了解它的认证业就是通过这个过滤器知道的。此时我们可以把所有东西都关掉,把 UsernamePasswordAuthenticationFilterI 粘贴复制点进去,点进来之后,可以看见我们的用户名必须叫 username,密码属性名叫 password,不可以用别的用户名和密码,否则它是不认识的。它规定了我们的处理器请求路径是 login,请求方式是 POST,否则也是不可以的。若我们的请求方式不是 POST,它会显示错误。

image.png

往下看,username 和 password 需要先提出来,request 是 HttpServletRequest中的request,从中 request.getMethod()出来username,同理可得,request.getMethod() 出来password。String username = this. obtainUsername(request);String password = this. obtainPassword(request)这两种是非常简单的。

在username=""中,写的是空值,如果是nu11值,它会空速不转,为了防止后续出现空指针。username=username.trin()中,username.后是空格,注意的是前后空格去掉,但是密码不去除,密码可能会加空格,也可以限制我们不加空格,也可以设置只用哪些字符,但是如果没有说明,可以填写空格。

image.png

用户名和密码在下方,在用户名前面又封装了UsernamePasswordAuthenticationToken,点击UsernamePasswordAuthenticationToken,就会出现如上图所示,两种构造方法名字一样,参数不一样。

第一种有 Object principal, Object credentials 这两个参数,第二种有Object principal, Object credentials, Collection<? extends GrantedAuthority> authori super(authorities) 这三种参数。

在第一种参数中,Object principal 是用户名,credentials 是密码,在以后做认证的时候需要注意的是,有可能会报错,用户名写错就会显示 Object principal 这个单词写错了,密码写错就会显示 credentials 这个单词写错。所以要对这两个单词眼熟。在下边 Collection 中不一定要赋值,可以看见它显示的是错误。在第二种中赋值,显示的就是 true。

所以综上,需要我们注意的是在认证前,它走的是第一种,认证错误,走的是第二种。换句话说,认证通过后,不给权限会显示认证不通过。

在最后一步 return this.getAuthenticationMnager().authenticate(authRequest);中认证最有逻辑,点击 authenticate,进入之后我们会发现,Authentication authenticate(Authentication varl) throws AuthenticationException 是个接口,点击ctrl h看到所有的实验类,所有带in的可以不用担心,在 ProviderManager.class中找到authenticate这个方法,在这个方法中,var8.hasNext的出现使得这个方法便利。在这个方法中,点击 getProviders,进入之后,我们会发现出现Lis<AuthenticationProvider>这个集合,它把每一种论证方式封装了一个叫AuthenticationProvidex 的对象,论证就是登录,就是查询验证密码。AuthenticationProvidex 是非常强大的,它也可以在第三方登录,例如微信登录,qq登录。如果是第三方登录,它的登录流程是不一样的,它会自动去判断我们是哪一种登录,然后选择对应的验证方式。

在 var8.hasNext 遍历中,找到 authenticate 这个方法名,和上述的方法名是相同的。点进去后,点击 ctrl h 进入,找到AbstractUserDetailsAuthenticationProvider,因为此时的认证流程并不是它的分支,所以它不能使用 Debug,它也进入不了此时的流程,这需要提前把我们的认证做完才可以进入。

此时不想要去认证,所以它走的是 AbstractUserDetailsAuthenticationProvider,需要注意的是用的是 ProviderManager.class 里的 authenticate。在AbstractUserDetailsAuthenticationProvider.class 中,找到 authenticate 这个方法,下边是它的认证过程。在正常流程中,retrieveUser在做认证,UsernamePasswordAuthenticationToken 是用户名和密码。点击 retrieveUser,进入之后出现 protected abstract UserDetails retrieveUser(Stringvarl,UsernamePasswordAuthenticationToken var2) throw AuthenticationExee 内幕,但是并没有实现,点击 ctrl h,出现DaoAuthenticationProvider 并点击,找到 retrieveUser,此时才是真正认证的业物。

UserDetails loadedUser = this. getUserDetailsService(). loadUserByUsername(username) 中的 UserDetails 是 Spring Security 内幕的用户对象。在我们自己的数据库有一张用户表,它对应的是我们自己的用户对象,但是我们自己的用户对象 Spring Security 是不知道的,它自己有一个用户对象,此时,这个用户对象我们想要得到,需要用用户名登录密码进行查询。

image.png

同理,它也是一样,不同的是比较复杂。它走的是 loadUserByllsername,点进去,出现 UserDetailsService,还出现 UserDetails loadUserByUsername(String varl) throws UsernameNotFoundException 接口需要我们去实验,UserDetails 是Spring Security 自己提供的用户对象,如果想使用自己的数据库的信息进行论证,我们就必须使用 UserDetailsService 接口,在接口内部根据里面的流程进行认证。我们已找到自己的数据库信息与 Spring Security 做衔接,有了 UserDetails loadUserByUsername(String varl) throws

UsernameNotFoundException接口方便我们做后续的工作。

image.png

相关文章
|
JSON 安全 Java
什么是JWT?如何使用Spring Boot Security实现它?
什么是JWT?如何使用Spring Boot Security实现它?
2054 5
|
2月前
|
搜索推荐 JavaScript Java
基于springboot的儿童家长教育能力提升学习系统
本系统聚焦儿童家长教育能力提升,针对家庭教育中理念混乱、时间不足、个性化服务缺失等问题,构建科学、系统、个性化的在线学习平台。融合Spring Boot、Vue等先进技术,整合优质教育资源,提供高效便捷的学习路径,助力家长掌握科学育儿方法,促进儿童全面健康发展,推动家庭和谐与社会进步。
|
9月前
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
498 0
|
9月前
|
监控 Java 应用服务中间件
微服务——SpringBoot使用归纳——为什么学习Spring Boot
本文主要探讨为什么学习Spring Boot。从Spring官方定位来看,Spring Boot旨在快速启动和运行项目,简化配置与编码。其优点包括:1) 良好的基因,继承了Spring框架的优点;2) 简化编码,通过starter依赖减少手动配置;3) 简化配置,采用Java Config方式替代繁琐的XML配置;4) 简化部署,内嵌Tomcat支持一键式启动;5) 简化监控,提供运行期性能参数获取功能。此外,从未来发展趋势看,微服务架构逐渐成为主流,而Spring Boot作为官方推荐技术,与Spring Cloud配合使用,将成为未来发展的重要方向。
364 0
微服务——SpringBoot使用归纳——为什么学习Spring Boot
|
6月前
|
安全 Java 数据库
Spring Boot 框架深入学习示例教程详解
本教程深入讲解Spring Boot框架,先介绍其基础概念与优势,如自动配置、独立运行等。通过搭建项目、配置数据库等步骤展示技术方案,并结合RESTful API开发实例帮助学习。内容涵盖环境搭建、核心组件应用(Spring MVC、Spring Data JPA、Spring Security)及示例项目——在线书店系统,助你掌握Spring Boot开发全流程。代码资源可从[链接](https://pan.quark.cn/s/14fcf913bae6)获取。
1046 2
|
8月前
|
Java Spring
Spring框架的学习与应用
总的来说,Spring框架是Java开发中的一把强大的工具。通过理解其核心概念,通过实践来学习和掌握,你可以充分利用Spring框架的强大功能,提高你的开发效率和代码质量。
204 20
|
6月前
|
负载均衡 Java API
基于 Spring Cloud 的微服务架构分析
Spring Cloud 是一个基于 Spring Boot 的微服务框架,提供全套分布式系统解决方案。它整合了 Netflix、Zookeeper 等成熟技术,通过简化配置和开发流程,支持服务发现(Eureka)、负载均衡(Ribbon)、断路器(Hystrix)、API网关(Zuul)、配置管理(Config)等功能。此外,Spring Cloud 还兼容 Nacos、Consul、Etcd 等注册中心,满足不同场景需求。其核心组件如 Feign 和 Stream,进一步增强了服务调用与消息处理能力,为开发者提供了一站式微服务开发工具包。
657 0
|
8月前
|
SQL 前端开发 Java
深入分析 Spring Boot 项目开发中的常见问题与解决方案
本文深入分析了Spring Boot项目开发中的常见问题与解决方案,涵盖视图路径冲突(Circular View Path)、ECharts图表数据异常及SQL唯一约束冲突等典型场景。通过实际案例剖析问题成因,并提供具体解决方法,如优化视图解析器配置、改进数据查询逻辑以及合理使用外键约束。同时复习了Spring MVC视图解析原理与数据库完整性知识,强调细节处理和数据验证的重要性,为开发者提供实用参考。
364 0
|
10月前
|
Java 应用服务中间件 Scala
Spring Boot 实现通用 Auth 认证的 4 种方式
本文介绍了在Spring Boot中实现通用Auth的四种方式:传统AOP、拦截器(Interceptor)、参数解析器(ArgumentResolver)和过滤器(Filter)。每种方式都通过实例代码详细说明了实现步骤,并总结了它们的执行顺序。首先,Filter作为Servlet规范的一部分最先被调用;接着是Interceptor,它可以在Controller方法执行前后进行处理;然后是ArgumentResolver,在参数传递给Controller之前解析并验证参数
227 1
|
10月前
|
IDE Java 应用服务中间件
spring boot 启动流程
Spring Boot 启动流程简介: 在使用 Spring Boot 之前,启动 Java Web 应用需要配置 Web 容器(如 Tomcat),并将应用打包放入容器目录。而使用 Spring Boot,只需运行 main() 方法即可启动 Web 应用。Spring Boot 的核心启动方法是 SpringApplication.run(),它负责初始化和启动应用上下文。 主要步骤包括: 1. **应用启动计时**:使用 StopWatch 记录启动时间。 2. **打印 Banner**:显示 Spring Boot 的 LOGO。 3. **创建上下文实例**:通过反射创建
564 5

热门文章

最新文章