Day 24 - Spring Security (一) 基本概念与流程

Spring Security 是Spring 官方建议的验证框架,提供了安全性方面的解决方案,这个部分应该是学习Spring Boot 很重要的一环,Spring Security 的功能很强大但也很复杂,它几乎将所有的元件都抽象化,以至於无法很直观的了解,这系列文的最後几篇打算详细介绍Spring Security,但本人也还是在学习Spring Security 的阶段,如果有讲错的地方还请见谅。

Spring Security 介绍

保护Web 资源的最好办法是使用Filter,保护方法呼叫的最好办法是使用Spring AOP,而Spring Security 则是为基於J2EE 开发的企业应用软件提供了根据Filter 和Spring AOP 设计的安全性框架,对存取权限进行验证(Authentication)和授权(Authorization),它对Web 安全性的支持主要依赖於大量的Filter,Filter 拦截请求并将请求转给认证和访问决策管理器处理,并强制安全性认证使用者身分和使用者许可权,从而增强安全性以达到保护Web 资源的目的。
除了正常的认证和授权外,它还提供了ACLs、LDAP、JAAS、CAS 等进阶特性以满足复杂环境下的安全需求。

核心概念

Spring Security 有三个核心概念。

  1. Principle : 代表使用者的物件,使用者并不仅是用户,也可以是装置或可以在应用程序中执行某种操作的其他系统。
  2. Authority : 代表使用者的角色,在一个系统中,系统会为不同的使用者分配不同的角色,每个使用者都应该有一种角色,如管理员、收费会员或一般会员,而不同的角色所拥有的许可权是不同的。
  3. Permission : 代表授权,对使用者的角色所拥有的许可权进行叙述。

验证和授权

对安全性的管理主要分为验证(Authentication)和授权(Authorization)两个部分。

  1. Authentication : 即验证,指的是建立Principle 的过程,支援主流的验证方式,如HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和LDAP 等。
    一般要求使用者提供使用者名称和密码,系统透过验证使用者名称和密码的正确性来完成验证的过程。
  2. Authorization : 即授权,它判断某个Principle 在应用程序中是否可以执行某个操作,在进行授权判断前,要求其所要使用到的规则必须在验证过程中就建立好了。

核心物件

  1. Authentication : 包含Principal、Credentials 和Authorities 的一个物件,其中Principal和Credentials 会因不同的Authentication 而有不同的定义。
    如登入时,Principal 通常会是登入的Username,而Credentials 则会是登入的Password,若是使用Token 时,Credentials 则可能是Token。
  2. GrantedAuthority : Authentication 中的Authorities 是一个GrantedAuthority 数组,设置被赋予的最高权限,权限是用字串定义,所有的权限字串都用ROLE_ 作为前缀。
  3. SecurityContext : 一个验证过的Authentication 物件。
  4. SecurityContextHolder : 用来储存验证过的Authentication ,也就是负责管理SecurityContext
  5. AuthenticationManager : 用於定义Spring Security 的Filter 如何执行身分验证的API。
  6. AuthenticationProvider : 用於执行特定类型的身分验证,如DaoAuthenticationProvider 用於使用者名称和密码的身分验证,而JwtAuthenticationProvider 用於对JWT 令牌进行身分验证。
  7. ProviderManager : AuthenticationManager 最常用的实作类别,负责管理AuthenticationProvider
  8. UserDetails : 作为封装使用者资讯的物件,包含使用者名称、密码、权限等。
  9. UserDetailsService : 用来载入使用者资讯,Spring Security 进行安全验证时收到输入请求中的使用者名称,会呼叫UserDetailsService 中的loadUserByUsername() 方法去寻找相应的使用者资讯,并封装成UserDetails 物件。

参考网站

Spring Security Reference


<<:  Leetcode: 100. Same Tree

>>:  【Day 2_ 高传真手游的未来到底是?】

Day16 资料库-model的创建(2)

我们昨天教了最基本的model建立了,相信大家应该大致都懂那些流程了吧!(应该都懂吧...) 大家一...

Python侦测VPN网路是否可连线 - Python练习题二

公司为跨国企业, 与工厂间的数据利用VPN进行资料交换, 利用Python配合Windows的排程记...

DAY21 呼叫时刻表样板

class Schedule(): def content(self): flex_message ...

Day23 Android - RxJava+Post

那麽今天主要要用RxJava来结合retrofit做Post的部分,与上次用Retrofit的cal...

D17: 工程师太师了: 第9话

工程师太师了: 第9话 杂记: 最近在泡咖啡 被同事问说: 你一天都喝几杯咖啡阿? 我的回答:我大概...