• springsecurity框架笔记


    springsecurity框架笔记

    springsecurity优点:

    1、易于理解的java Security Api

    2、简单的身份认证(登录),支持多种数据源(LDAP,JDBC,KERBEROS)

    3、对角色的简单授权(访问控制),支持细粒度的鉴权

    4、支持一级缓存,以提升应用程序的性能

    5、内置的基于POJO企业回话管理,适用于web以及非web环境

    6、异构客户端会话访问

    7、非常简单的加密API

    缺点:

    不能脱离spring

    功能简介

    认证、授权、安全防护

    场景

    用户登录,传统基于web 开发的项目的登录功能

    用户授权,在系统中用户拥有那些操作权限

    单一登录,一个账号只能在同一时间在同一地方登录,如果在其他地方进行第二次登录,则提出之前的登录操作。

    集成cas,做单点登录,即多个系统只需登录一次,无需重复登录

    集成oauth2,做登录授权,可以用于app登录和第三方登录(qq,微信),也可以实现cas功能

    springsecurity认证基本原理与认证2种方式

    Spring Security功能的实现主要是由一系列过滤器相互配合完成。也称之为过滤器链

    过滤器是一种典型的AOP思想,下面简单了解下这些过滤器链,后续再源码剖析中在涉及到过滤器链在仔细讲解。
    1. org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter 根据请求封装获取WebAsyncManager,从WebAsyncManager获取/注册的安全上下文可调 用处理拦截器

    2. org.springframework.security.web.context.SecurityContextPersistenceFilter SecurityContextPersistenceFilter主要是使用SecurityContextRepository在session中保存 或更新一个SecurityContext,并将SecurityContext给以后的过滤器使用,来为后续fifilter 建立所需的上下文。SecurityContext中存储了当前用户的认证以及权限信息。

    3. org.springframework.security.web.header.HeaderWriterFilter 向请求的Header中添加相应的信息,可在http标签内部使用security:headers来控制

    4. org.springframework.security.web.csrf.CsrfFilter csrf又称跨域请求伪造,SpringSecurity会对所有post请求验证是否包含系统生成的csrf的 token信息,如果不包含,则报错。起到防止csrf攻击的效果。

    5. org.springframework.security.web.authentication.logout.LogoutFilter org.springframework.boot spring-boot-starter-security 匹配URL为/logout的请求,实现用户退出,清除认证信息。

    6. org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter 表单认证操作全靠这个过滤器,默认匹配URL为/login且必须为POST请求。

    7. org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter 如果没有在配置文件中指定认证页面,则由该过滤器生成一个默认认证页面。

    8. org.springframework.security.web.authentication.ui.DefaultLogoutPageGeneratingFilter 由此过滤器可以生产一个默认的退出登录页面

    9. org.springframework.security.web.authentication.www.BasicAuthenticationFilter 此过滤器会自动解析HTTP请求中头部名字为Authentication,且以Basic开头的头信息。

    10. org.springframework.security.web.savedrequest.RequestCacheAwareFilter 通过HttpSessionRequestCache内部维护了一个RequestCache,用于缓存 HttpServletRequest

    11. org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter 针对ServletRequest进行了一次包装,使得request具有更加丰富的API

    12. org.springframework.security.web.authentication.AnonymousAuthenticationFilter 当SecurityContextHolder中认证信息为空,则会创建一个匿名用户存入到 SecurityContextHolder中。spring security为了兼容未登录的访问,也走了一套认证流程, 只不过是一个匿名的身份。

    13. org.springframework.security.web.session.SessionManagementFilter securityContextRepository限制同一用户开启多个会话的数量

    14. org.springframework.security.web.access.ExceptionTranslationFilter 异常转换过滤器位于整个springSecurityFilterChain的后方,用来转换整个链路中出现的异 常

    15. org.springframework.security.web.access.intercept.FilterSecurityInterceptor 获取所配置资源访问的授权信息,根据SecurityContextHolder中存储的用户信息来决定其 是否有权限。 Spring Security默认加载15个过滤器, 但是随着配置可以增加或者删除一些过滤器.

    认证方式
    1. HttpBasic认证

    HttpBasic登录验证模式是Spring Security实现登录验证最简单的一种方式,也可以说是最简陋的一种方式。它的目的并不是保障登录验证的绝对安全,而是提供一种“防君子不防小人”的登录验证。
    在使用的Spring Boot早期版本为1.X版本,依赖Security 4.X版本,那么就无需任何配置,启动项目访问则会弹出默认的httpbasic认证。现在使用的是spring boot2.0以上版本(依赖Security5.X版本),HttpBasic不再是默认的验证模式,在spring security 5.x默认的验证模式已经是表单模式。
    HttpBasic模式要求传输的用户名密码使用Base64模式进行加密。如果用户名是 "admin" ,密码是“ admin”,则将字符串"admin:admin" 使用Base64编码算法加密。加密结果可能是:YWtaW46YWRtaW4=HttpBasic模式真的是非常简单又简陋的验证模式,Base64的加密算法是可逆的,想要破解并不难. 
    1. formLogin登录认证模式 Spring Security的HttpBasic模式,该模式比较简单,只是进行了通过携带Http的Header进行简单的登录验证,而且没有定制的登录页面,所以使用场景比较窄。对于一个完整的应用系统,与登录验证相关的页面都是高度定制化的,非常美观而且提供多种登录方式。这就需要Spring Security支持我们自己定制登录页面, spring boot2.0以上版本(依赖Security 5.X版本)默认会生成一个登录页面

    表单认证

    spring Security 中,安全构建器 HttpSecurity 和 WebSecurity 的区别是 :

    1. WebSecurity 不仅通过 HttpSecurity 定义某些请求的安全控制,也通过其他方式定义其他某些 请求可以忽略安全控制;

    2. HttpSecurity 仅用于定义需要安全控制的请求(当然 HttpSecurity 也可以指定某些请求不需要 安全控制);

    3. 可以认为 HttpSecurity 是 WebSecurity 的一部分, WebSecurity 是包含 HttpSecurity 的更大 的一个概念;

    4. 构建目标不同 WebSecurity 构建目标是整个 Spring Security 安全过滤器 FilterChainProxy`, HttpSecurity 的构建目标仅仅是 FilterChainProxy 中的一个 SecurityFilterChain 。

  • 相关阅读:
    Java教程之String类的底层原理和版本演变
    stm32----ADC模数转换
    【leetcode】两句话中的不常见单词 c++
    重庆自考和成人高考有何区别?哪个含金量更高?
    Spring--bean的生命周期
    Hbuilder打包安卓H5-APP,APP与程序分离,更新无需重新打包
    做好自己安全第一责任人 嘀嗒全面上线安全带智能语音提醒
    编写一个vscode的插件
    英国2.8万的A-Level学生拿不到offer
    ST2Vec: Spatio-Temporal Trajectory Similarity Learning in Road Networks
  • 原文地址:https://blog.csdn.net/penliyoushui/article/details/136193864