SpingSecurity框架重要知识点(理解)

简介: SpingSecurity框架重要知识点(理解)

一,SpingSecurity本质是一个过滤器链(11个过滤器)

1.HttpSessionContextIntegrationFilter

位于过滤器顶端,第一个起作用的过滤器。

  • 用途一,在执行其他过滤器之前,率先判断用户的session中是否已经存在一个SecurityContext了。如果存在,就把SecurityContext拿出来,放到SecurityContextHolder中,供Spring Security的其他部分使用。如果不存在,就创建一个SecurityContext出来,还是放到SecurityContextHolder中,供Spring Security的其他部分使用。
  • 用途二,在所有过滤器执行完毕后,清空SecurityContextHolder,因为SecurityContextHolder是基于ThreadLocal的,如果在操作完成后清空ThreadLocal,会受到服务器的线程池机制的影响。

2.LogoutFilter

只处理注销请求,默认为/j_spring_security_logout。

用途是在用户发送注销请求时,销毁用户session,清空SecurityContextHolder,然后重定向到注销成功页面。可以与rememberMe之类的机制结合,在注销的同时清空用户cookie。

3.AuthenticationProcessingFilter

处理form登陆的过滤器,与form登陆有关的所有操作都是在此进行的。

此过滤器执行的基本操作时,通过用户名和密码判断用户是否有效,如果登录成功就跳转到成功页面(可能是登陆之前访问的受保护页面,也可能是默认的成功页面),如果登录失败,就跳转到失败页面。

4.DefaultLoginPageGeneratingFilter

此过滤器用来生成一个默认的登录页面,默认的访问地址为/spring_security_login,这个默认的登录页面虽然支持用户输入用户名,密码,也支持rememberMe功能,但是因为太难看了,只能是在演示时做个样子,不可能直接用在实际项目中。

5.BasicProcessingFilter

此过滤器用于进行basic验证,功能与AuthenticationProcessingFilter类似,只是验证的方式不同。

6.SecurityContextHolderAwareRequestFilter

此过滤器用来包装客户的请求。目的是在原始请求的基础上,为后续程序提供一些额外的数据。比如getRemoteUser()时直接返回当前登陆的用户名之类的。

7.RememberMeProcessingFilter

此过滤器实现RememberMe功能,当用户cookie中存在rememberMe的标记,此过滤器会根据标记自动实现用户登陆,并创建SecurityContext,授予对应的权限。

在配置文件中使用auto-config="true"就会自动启用rememberMe

实际上,Spring Security中的rememberMe是依赖cookie实现的,当用户在登录时选择使用rememberMe,系统就会在登录成功后将为用户生成一个唯一标识,并将这个标识保存进cookie中,我们可以通过浏览器查看用户电脑中的cookie。

8.AnonymousProcessingFilter

为了保证操作统一性,当用户没有登陆时,默认为用户分配匿名用户的权限。

在配置文件中使用auto-config="true"就会启用匿名登录功能。在启用匿名登录之后,如果我们希望允许未登录就可以访问一些资源,可以在进行如下配置。

<http auto-config='true'>
    <intercept-url pattern="/" access="IS_AUTHENTICATED_ANONYMOUSLY" />
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>
设置成 ROLE_ANONYMOUS 也可以。
<http auto-config='true'>
    <intercept-url pattern="/" filters="none" />
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>

filters="none"表示当我们访问“/”时,是不会使用任何一个过滤器去处理这个请求的,它可以实现无需登录即可访问资源的效果,但是因为没有使用过滤器对请求进行处理,所以也无法利用安全过滤器为我们带来的好处,最简单的,这时SecurityContext内再没有保存任何一个权限主体了,我们也无法从中取得主体名称以及对应的权限信息。

9.ExceptionTranslationFilter

此过滤器的作用是处理中FilterSecurityInterceptor抛出的异常,然后将请求重定向到对应页面,或返回对应的响应错误代码。

10.SessionFixationProtectionFilter

防御会话伪造攻击。

解决session fix的问题其实很简单,只要在用户登录成功之后,销毁用户的当前session,并重新生成一个session就可以了。

session-fixation-protection的值共有三个可供选择,none,migrateSession和newSession。默认使用的是migrationSession

<http auto-config='true' session-fixation-protection="none">
    <intercept-url pattern="/admin.jsp" access="ROLE_ADMIN" />
    <intercept-url pattern="/**" access="ROLE_USER" />
</http>

11.FilterSecurityInterceptor

用户的权限控制都包含在这个过滤器中。

功能一:如果用户尚未登陆,则抛出AuthenticationCredentialsNotFoundException“尚未认证异常”。

功能二:如果用户已登录,但是没有访问当前资源的权限,则抛出AccessDeniedException“拒绝访问异常”。

功能三:如果用户已登录,也具有访问当前资源的权限,则放行。

二,两个重要的接口

1,UserDetailsService

该接口是一个虚接口,用于实现用户登陆认证时从数据库等数据源查询用户信息。查询数据库中的用户名和密码。

2,PasswordEncode

该接口用于对密码信息进行加密。

目录
相关文章
|
Java 程序员 应用服务中间件
【推荐】深入浅出学习Spring框架【上】
【推荐】深入浅出学习Spring框架【上】
55 0
|
前端开发
前端常用小知识点总结
前端常用小知识点总结
|
8天前
|
自然语言处理 安全 PHP
深入浅出PHP编程:从基础到实战
【10月更文挑战第36天】本文将带你走进PHP的奇妙世界,无论你是初学者还是有一定经验的开发者,都将从中获益。文章首先介绍PHP的基础概念和语法,然后通过实际代码示例,展示如何利用PHP进行高效的Web开发。最后,我们将探讨一些高级主题,如面向对象编程、数据库操作以及安全性问题。让我们一起开启PHP的学习之旅吧!
|
22天前
|
JavaScript Java API
深入浅出后端开发:从基础到进阶
本文将带你走进后端开发的神秘世界,从最基础的概念讲起,逐步深入到高级技术的应用。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供宝贵的知识和实用的技巧,帮助你在后端开发的道路上更进一步。我们将涵盖后端开发的基本概念、常用技术栈、数据库管理、API设计以及性能优化等关键领域,让你全面了解后端开发的方方面面。
|
6月前
|
存储 移动开发 前端开发
【Uniapp 专栏】Uniapp 架构设计与原理探究
【5月更文挑战第12天】Uniapp是一款用于跨平台移动应用开发的框架,以其高效性和灵活性脱颖而出。它基于HTML、CSS和Vue.js构建视图层,JavaScript处理逻辑层,管理数据层,实现统一编码并支持原生插件扩展。通过抽象平台特性,开发者能专注于业务逻辑,提高开发效率。尽管存在兼容性和复杂性挑战,但深入理解其架构设计与原理将助力开发者创建高质量的跨平台应用。随着技术进步,Uniapp将继续在移动开发领域扮演重要角色。
220 1
【Uniapp 专栏】Uniapp 架构设计与原理探究
|
6月前
|
JavaScript 前端开发 安全
前端部分知识点总结
前端部分知识点总结
74 0
|
存储 监控 Java
【推荐】深入浅出学习Spring框架【中】
【推荐】深入浅出学习Spring框架【中】
36 0
|
存储 人工智能 安全
[总结] C++ 知识点 《一》基础篇
[总结] C++ 知识点 《一》基础篇
|
前端开发 JavaScript 算法
前端面试题总结框架
前端面试题总结框架
143 0
查漏补缺!深入浅出Java23种设计模式汇总(附源码解析)
在软件开发的历程中,正是无数前辈们本着追求完美的架构设计和代码设计的初心。经过无数前辈们的探索和努力,逐渐形成了一系列的设计原则和设计模式。 对于ava语言来说,通常包含有6大设计原则和23种设计模式,这些都是前辈们对于开发思想的结晶。我们学习和理解这些设计原则和设计模式,深入掌握其实现原理和使用场景,能够更好的设计我们的系统架构。编写出具有高性能高井发高可用、高可扩展性和高可维护性的代码。