前言

最近在潜心研究一下安全框架,并在此进行一下记录,如有不对还请不吝赐教。

对于一个安全管理管理框架而言,无论是Shiro还是SpringSecurity,最核心的功能,无非就是两个

  • 认证:你是谁?
  • 授权:你可以做什么

认证

SpringSecurity支持多种不同的认证方式,这些认证方式有的是SpringSecurity自己提供的认证功能,有的是第三方标准组织制定的。SpringSecurity集成的主流认证机制主要有如下几种:

  • 表单认证
  • OAuth2.0认证
  • SAML2.0认证
  • CAS认证
  • RememberMe自动认证
  • JAAS认证
  • OpenID认证
  • Pre-Authentication Scenarios认证
  • X509认证
  • HTTP Basic认证
  • HTTP Digest认证

作为一个开放的平台,SpringSecurity提供的认证机制不仅仅包括上面,我们还可以通过引入第三方依赖来支持更多的认证方式,同时,如果这些认证方式无法满足我们的需求,我们也可以自定义认证逻辑,特别是当我们和一些“老破旧”的系统进行集成时,自定义认证就显得非常重要了。

授权

​ 无论采用了上面哪种方式认证,都不影响在SpringSecurity中使用授权功能。SpringSecurity支持基于URL的请求授权,支持方法的访问授权,支持SpEL访问控制,支持域对象安全,同时也支持动态权限配置、支持RBAC权限模型等,总之,我们常见的权限管理需求,SpringSecurity基本上都是支持的。

其他

​ 在认证和授权这两个核心功能之外,SpringSecurity还提供了很多安全管理的“周边功能”,这也是一个非常重要的特色,在开发中,即便我们不了解很多网络攻击,只要用了SpringSecurity它会帮助我们自动防御很多网络攻击,例如CSRF攻击,会话固定攻击等,同时还提供了HTTP防火墙来拦截大量的非法请求。

认证和授权

认证

在SpringSecurity的架构设计中,认证(Authentication)和授权(Authorization)是分开的,无论使用什么样的认证方式,都不会影响授权,这是两个独立的存在,这种独立带来的好处之一,就是可以非常方便地整合一些外部地认证方案。

在SpringScuerity中,用户地认证信息主要是由Authentication的实现类来保存,接口定义如下:

public interface Authentication extends Principal, Serializable {//用来获取用户的权限Collection<? extends GrantedAuthority> getAuthorities();//用来获取用户凭证,一般来说是密码Object getCredentials();//用来获取用户携带的详细信息,可能是当前请求之类等Object getDetails();//用来获取当前用户,例如是一个用户或一个用户对象Object getPrincipal();//当前用户是否认证成功。boolean isAuthenticated();void setAuthenticated(boolean isAuthenticated) throws IllegalArgumentException;}

​ 当用户使用用户名/密码登录或者使用Remember-me登录时,都会对于一个不同的Authentication实例。

​ SpringSecurity中的认证工作主要由AuthenticationManager接口负责,我们来看一下该接口的定义

public interface AuthenticationManager {Authentication authenticate(Authentication authentication) throws AuthenticationException;}

​ AuthenticationManager接口只有一个authenticate方法可以用来做认证,该方法有三个不同的返回值:

  • 返回Authentication : 表示认证成功

  • 抛出AuthenticationException异常:表示用户输入了无效的凭证.

  • 返回null,表示不能断定

    AuthenticationManager最主要的实现类是ProviderManager,ProviderManager管理了众多的AuthenticationProvider实例,AuthenticationProvider有点类似于AuthenticationManager,但是它多了一个supports方法用来短评是否指出给定的Authenticaion类型。

public interface AuthenticationProvider {Authentication authenticate(Authentication authentication) throws AuthenticationException;boolean supports(Class<?> authentication);}

由于Authentication拥有众多不同的实现类,这些不同的实现类又由不能的AuthenticationProvider来处理,所以AuthenticationProvider会有一个supports方法,来判断当前的AuthenticationProvider是否支持对应的Authentication

在一次完整的认证流程中,可能会存在多个AuthenticationProvider(例如,项目同时支持form表单登录和短信验证码登录),多个AuthenticationProvider统一由ProviderManager管理,同时ProviderManager具有一个可选的parent,如果所有的AuthenticationProvider都认证失败,那么就算调用parent进行认证。parent相当于一个备用认证方式,即各个AuthenticationProvider都无法处理认证问题的时候,就由它来收拾。

授权

当认证完成后,接下来就是授权了。在SpringSecurity的授权体系中,有两个关键接口:

  • AccessDecisionManager
  • AccessDecisionVoter

AccessDecisionVoter是一个投票器,拉票器会检查用户是否具备应有的角色,进而投出赞成、反对或者弃权票,AccessDecisionManager则是一个决策器,来决定此次访问是否被允许。AccessDecisionVoter和AccessDecisionManager都有众多的实现类,在AccessDecisionManager中会挨个遍历AccessDecisionVoter,进而决定是否允许用户访问,因为AccessDecisionVoter和AccessDecisionManager两者的关系类似于AuthenticationProvider和ProviderManager的关系。

在SpringSecurity中,用户请求一个资源(通常是一个接口或者一个java方法)所需要的角色会被封装成一个ConfigAttribute对象,在ConfigAttribute中只有一个getAttribute方法,该方法返回一个Stirng字符串,就是角色名称。一般来说,角色名称都带有一个ROLE_ 前缀,投票器AccessDecisionVoter所做的事情,其实就算比较用户所具备的角色和请求某个资源所需要的ConfigAttribute之间的关系。

SpringSecurity(一)核心功能相关推荐

  1. Shiro 核心功能案例讲解 基于SpringBoot 有源码

    Shiro 核心功能案例讲解 基于SpringBoot 有源码 从实战中学习Shiro的用法.本章使用SpringBoot快速搭建项目.整合SiteMesh框架布局页面.整合Shiro框架实现用身份认 ...

  2. 002 第一季SpringBoot2核心技术-核心功能:配置文件、Web开发(原生组件)、数据访问、单元测试、指标监控、原理解析:@Value、命令行参数、手动获取bean、自定义starter

    三.核心技术之- ->核心功能 1. 配置文件 1.1 文件类型 1.1.1 properties 同以前的properties用法 优先级高于yml的方式. 1.1.2 yaml 1) 简介 ...

  3. springSecurity 常用安全功能汇总(含案例分析)

    Spring Security 是 Spring 家族中的一个重要的安全管理框架(底层是拦截器和过滤器),一般多用于JavaWEB项目,对整个项目的授权.认证以及攻击防护(伪造身份)进行监管控制,例如 ...

  4. Springboot总结,核心功能,优缺点

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试资料 作者:lizmit https://blog.csdn.net/q ...

  5. 一文带你看懂Springboot核心功能及优缺点

    点击上方[视学算法]→右上角[...]→[设为星标⭐] SpringBoot核心功能 1.独立运行Spring项目 Spring boot 可以以jar包形式独立运行,运行一个Spring Boot项 ...

  6. SAP PLM 进阶 2 – 主要核心功能

    SAP PLM 进阶 2 – 主要核心功能 SAP PLM 核心业务逻辑 功能1:产品创意的组合管理 SAP产品组合管理概要 产品组合管理的主要对象 产品组合管理结构示例 新产品立项审批过程 功能2: ...

  7. 产品设计认知:如何构建A/B测试系统,其核心功能有哪些?

    前言 不管在精益创业还是增长黑客理论中,A/B测试作为一种成熟的数据驱动产品优化的科学方法,其核心意义并不在于某一次试验的成功或者失败,而是这种通过试验和数据驱动的产品不断进化过程.A/B测试系统就是 ...

  8. 【阿里云课程】1小时快速掌握Tensorflow核心功能,完成完整的项目实践

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第7课中一节,介绍如下: Tensorflow快速入门与实践 本节课内容为:深度学习系列课程第7期,Tensorflow快速 ...

  9. 【阿里云课程】1小时快速掌握Caffe核心功能,完成完整的项目实践

    大家好,继续更新有三AI与阿里天池联合推出的深度学习系列课程,本次更新内容为第7课中一节,介绍如下: Caffe快速入门与实践 本节课内容为:深度学习系列课程第7期,Caffe快速入门与实践,讲述Ca ...

最新文章

  1. sap*/pass无法登陆
  2. html+id选择器如何使用方法,id选择器_HTML+CSS前端基础知识教程_腾讯视频
  3. BlackHat Arsenal USA 2018 ToolsWatch黑客工具库
  4. 栈和队列之用java实现栈
  5. Git gitignore文件讲解
  6. OJ1003: 两个整数的四则运算
  7. linux arm 64 hard float abi,ARMHF(hard-float ABI for ARM)
  8. Linux命令收藏-进程管理
  9. 检查虚拟机是否使用virtio
  10. 【软件工程】课程设计库存管理系统
  11. 去除Edge打开外部应用时的提醒
  12. Mac上的网络视频会议软件
  13. 201704 创建财务凭证函数
  14. 蓝桥杯 - 明码 java
  15. requests模块的异常处理
  16. SV学习(1)——数据类型
  17. 经纬度转换成屏幕坐标
  18. Jacobi 和 Gauß-Seidel 迭代方法
  19. 助力中小企业级连云端,促进工业互联网平台蓬勃发展,全套解决方案。附:技术产品...
  20. 《剑指offer》内容总结

热门文章

  1. SSH端口转发(ssh隧道)
  2. 2022广东省+深圳市+11个区“专精特新”及小巨人企业补贴政策
  3. java stream order by_Java Stream 使用详解
  4. IBM X3650服务器使用说明一
  5. 小学认识计算机说课ppt,小学信息技术《认识word》说课稿
  6. 如何避免Excel转PDF后内容少了一半
  7. Shader:优化破解变体的“影分身”之术
  8. js 类似发微博或者微信朋友圈的时间显示 刚刚 几天前
  9. adobe flash player 过期问题
  10. vba字典重复key_字典去除重复项问题