当前位置: 首页 > news >正文

springSecurity学习之springSecurity简介

springSecurity简介

Spring Security 基于 Spring 框架,提供了一套 Web 应用安全性的完整解决方案,是一种基于Spring AOP和Servlet规范中的Filter实现的安全框架,其本质是一个过滤器链

名词解释

**主体(principal)**使用系统的用户或设备或从其他系统远程登录的用户等等,谁在使用该系统

**认证(authentication)**权限管理系统确认一个主体的身份,允许主体进入系统,“主体”证明自己是谁

**授权(authorization)**将操作系统的“权力”授予“主体”,这样主体就具备了操作系统中特定功能的能力,授权就是给用户分配权限

<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId>
</dependency>

核心类

  • SecurityContextHolder 用于存储安全上下文的信息,当前用户、是否被认证、权限都存储在其中

    提供了三种存储策略,当然也可以自定义储存策略,设置strategyName来进行反射获取

    • MODE_THREADLOCAL 使用ThreadLocalSecurityContextHolderStrategy,默认
    • MODE_INHERITABLETHREADLOCAL 使用InheritableThreadLocalSecurityContextHolderStrategy,子线程可以使用父线程中存放的变量
    • MODE_GLOBAL 使用GlobalSecurityContextHolderStrategy,全局使用同一个SecurityContext

    SecurityContextHolder.getContext()即为SecurityContext,其中保存着当前正在访问系统的用户详细信息,默认使用的是ThreadLocal来保存SecurityContext,在每次request结束后都会自动清除当前线程的ThreadLocal

  • Authentication 继承自Principal,可以通过该接口来获取到用户的权限、密码以及身份信息和认证信息,登录成功后会保存在SecurityContextHolder.getContext()中

    SecurityContextHolder.getContext().getAuthentication()
    
    • getAuthorities 获取权限
    • getCredentials 获取密码,用户提交的密码
    • getDetails 获取详情
    • getPrincipal 获取认证信息,返回的是UserDetails的实现类
  • AuthenticationManager 认证相关的核心接口,定义了认证方法authenticate

    // 接收认证请求Authentication,如果认证成功,则返回一个封装了当前用户权限等信息的Authentication对象
    Authentication authenticate(Authentication authentication)throws AuthenticationException;
    
  • ProviderManager 认证管理,实现了AuthenticationManager,是默认实现。其内部是一个AuthenticationProvider列表,并在authenticate方法中将真正的认证逻辑委托给了AuthenticationProvider对象

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {// 配置自定义的用户服务,查找用户// authenticationProvider是进行this.authenticationProviders.add(authenticationProvider);将AuthenticationProvider加到列表中auth.authenticationProvider(authenticationProvider());
    }
    
  • DaoAuthenticationProvider 该类是AuthenticationProvider最常用的实现类,使用UserDetailsService来加载UserDetails,用来获取用户提交的用户名和密码对比正确性,实现了其父类的两个抽象方法,通过该类来进行认证用户

    // 用于身份认证
    protected abstract void additionalAuthenticationChecks(UserDetails userDetails,UsernamePasswordAuthenticationToken authentication)
    // 用于从数据库获取用户信息,  这里会调用userDetailsService.loadUserByUsername方法来进行获取
    protected abstract UserDetails retrieveUser(String username,UsernamePasswordAuthenticationToken authentication)throws AuthenticationException;
    
  • UserDetails 用户信息

    public interface UserDetails extends Serializable {Collection<? extends GrantedAuthority> getAuthorities();// 正确的密码String getPassword();String getUsername();boolean isAccountNonExpired();boolean isAccountNonLocked();boolean isCredentialsNonExpired();boolean isEnabled();
    }
    
  • UserDetailsService 负责获取正确的用户信息,认证时会通过UserDetailsService.loadUserByUsername来获取到对应的UserDetails进行认证。认证通过后将该UserDetails赋给Authentication的principal,然后再把Authentication存入SecurityContext中。提供了几个实现类,也可以实现UserDetailsService接口来进行自定义。

    public interface UserDetailsService {UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
    }
    
  • GrantedAuthority 表示权限,Authentication.getAuthorities可以获取当前Authentication的权限,是一个GrantedAuthority数组

进行认证

UsernamePasswordAuthenticationFilter

对/login 的 POST 请求做拦截,校验表单中用户名,密码

public Authentication attemptAuthentication(HttpServletRequest request,HttpServletResponse response) throws AuthenticationException {if (postOnly && !request.getMethod().equals("POST")) {throw new AuthenticationServiceException("Authentication method not supported: " + request.getMethod());}String username = obtainUsername(request);String password = obtainPassword(request);if (username == null) {username = "";}if (password == null) {password = "";}username = username.trim();// 用户名和密码被过滤器获取到,封装成 Authentication,通常情况下是 UsernamePasswordAuthenticationToken这个实现类UsernamePasswordAuthenticationToken authRequest = new UsernamePasswordAuthenticationToken(username, password);// Allow subclasses to set the "details" propertysetDetails(request, authRequest);// AuthenticationManager 身份管理器负责验证这个 Authenticationreturn this.getAuthenticationManager().authenticate(authRequest);
}
# 配置用户名,密码
security:user:name: adminpassword: admin

其中的用户名密码都是spring security生成或者配置的,但是在实际使用中用户名和密码都是从数据库去进行读取的,所以这段逻辑需要进行自定义,如果需要自定义逻辑时,需要实现 UserDetailsService 接口

public interface UserDetailsService {UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}

https://zhhll.icu/2021/框架/springSecurity/1.springSecurity简介/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 贝锐蒲公英远程运维方案:即装即用、无需专线,断网也可远程维护
  • Linux系统学习日记——vim操作手册
  • 网络安全防御 -- 双机热备和带宽管理综合实验
  • 【iOS】——消息传递底层实现
  • 10:00面试,10:08就出来了,问的问题有点变态。。。
  • 简单工厂模式、工厂模式和抽象工厂模式的区别
  • 【Mamba】Mamba的部署
  • 2024年计算机软考中级【硬件工程师】面试题目汇总(附答案)
  • 项目管理_XX市XX区人民医院HRP信息系统建设项目(成本管理)实例
  • 【雷丰阳-谷粒商城 】【分布式高级篇-微服务架构篇】【25】【分布式事务】
  • 使用JWT双令牌机制进行接口请求鉴权
  • pikachu之暴力破解
  • Redis的AOF持久化策略(AOF的工作流程、AOF的重写流程,操作演示、注意事项等)
  • Ruby教程
  • 浏览器跨tab页面通信方式总结
  • [NodeJS] 关于Buffer
  • canvas 绘制双线技巧
  • codis proxy处理流程
  • Invalidate和postInvalidate的区别
  • Java 最常见的 200+ 面试题:面试必备
  • JavaScript 基础知识 - 入门篇(一)
  • JavaScript 无符号位移运算符 三个大于号 的使用方法
  • javascript从右向左截取指定位数字符的3种方法
  • Javascript基础之Array数组API
  • MySQL几个简单SQL的优化
  • Promise初体验
  • Python学习笔记 字符串拼接
  • 编写高质量JavaScript代码之并发
  • 欢迎参加第二届中国游戏开发者大会
  • ------- 计算机网络基础
  • 力扣(LeetCode)965
  • 聊聊flink的BlobWriter
  • 强力优化Rancher k8s中国区的使用体验
  • 通过获取异步加载JS文件进度实现一个canvas环形loading图
  • 微信开源mars源码分析1—上层samples分析
  • 做一名精致的JavaScripter 01:JavaScript简介
  • 《天龙八部3D》Unity技术方案揭秘
  • Redis4.x新特性 -- 萌萌的MEMORY DOCTOR
  • ​Base64转换成图片,android studio build乱码,找不到okio.ByteString接腾讯人脸识别
  • ​一文看懂数据清洗:缺失值、异常值和重复值的处理
  • # Redis 入门到精通(七)-- redis 删除策略
  • #pragma预处理命令
  • $ is not function   和JQUERY 命名 冲突的解说 Jquer问题 (
  • (33)STM32——485实验笔记
  • (4)Elastix图像配准:3D图像
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (Matalb时序预测)PSO-BP粒子群算法优化BP神经网络的多维时序回归预测
  • (编译到47%失败)to be deleted
  • (附源码)springboot 个人网页的网站 毕业设计031623
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (四)图像的%2线性拉伸
  • (一)kafka实战——kafka源码编译启动
  • (一)spring cloud微服务分布式云架构 - Spring Cloud简介
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • *1 计算机基础和操作系统基础及几大协议