第九期读书会深入浅出Spring Security读书笔记整理

【摘要】 一、Spring Security简介缘起:在 Web 应用开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题,就可能陷入一个两难的境地:一方面,应用存在严重的安全漏洞,无法满足用户的要求,并可能造成用户的隐私数据被攻击者窃取;另一方面,应用的基本架构已经确定,要修复安全漏洞,可能需要对系统的架构做出…

一、Spring Security简介

缘起:

在 Web 应用开发中,安全一直是非常重要的一个方面。安全虽然属于应用的非功能性需求,但是应该在应用开发的初期就考虑进来。如果在应用开发的后期才考虑安全的问题,就可能陷入一个两难的境地:一方面,应用存在严重的安全漏洞,无法满足用户的要求,并可能造成用户的隐私数据被攻击者窃取;另一方面,应用的基本架构已经确定,要修复安全漏洞,可能需要对系统的架构做出比较重大的调整,因而需要更多的开发时间,影响应用的发布进程。因此,从应用开发的第一天就应该把安全相关的因素考虑进来,并在整个应用的开发过程中。

Spring Security 简介:

为什么选择 Spring Security?

Shiro本身是一个老牌的安全管理框架(一个强大且易用的Java安全框架),能够非常清晰的处理身份验证、授权、管理会话以及密码加密。有着众多的优点,例如轻量、简单、易于集成、可以在JavaSE环境中使用等。不过在微服务面前,它无法充分展示自己的优势。

Spring Security作为Spring家族的一员,在和Spring家族的其他成员进行整合时,具有其他框架无可比拟的优势,同时对OAuth2有着良好的支持,再加上Spring Cloud对Spring Security的不断加持,让Spring Security成为微服务项目的首选安全管理方案。除了不能脱离Spring,shiro的功能它都有。

所以推荐选择Spring Security。

Spring Security 核心功能:

认证 (你是谁)(Authentication):

Authentication 是一个接口,用来表示用户认证信息的,在用户登录认证之前相关信息会封装为一个 Authentication 具体实现类的对象,在登录认证成功之后又会生成一个信息更全面,包含用户权限等信息的 Authentication 对象,然后把它保存在 SecurityContextHolder 所持有的 SecurityContext 中,供后续的程序进行调用,如访问权限的鉴定等。

授权 (你能干什么)(Authorization):

也叫访问控制,即在应用中控制谁访问哪些资源(如访问页面/编辑数据/页面操作等)。在授权中需了解的几个关键对象:主体(Subject)、资源(Resource)、权限(Permission)、角色(Role)。

Spring Security 整体架构:

认证和授权:在Spring Security的授权体系中,有两个关键接口:AccessDecisionManager和AccessDecisionVoter

Web 安全:在Spring Security中,认证、授权等功能都是基于过滤器来完成的。开发者所见到的Spring Security提供的功能,都是通过这些过滤器来实现的,这些过滤器按照既定的优先级排列,最终形成一个过滤器链。开发者也可以自定义过滤器,并通过@Order注解去调整自定义过滤器在过滤器链中的位置。需要注意的是,默认过滤器并不是直接放在Web项目的原生过滤器链中,而是通过一个FilterChainProxy来统一管理。

总结:

Spring 是一个非常流行和成功的java应用开发框架。 

Spring Security 基于Spring 框架,提供了一套web应用安全性的完整解决方案。

Spring Security 核心功能是:认证和授权。

Spring安全的所有内部过滤器对于容器来说都是透明的。

二、Spring Security 认证流程分析

Spring Security是一款强大的安全认证服务框架,它的原理就是在访问我们的系统前加了一系列的过滤器,可以称为过滤器链。它的两大核心就是认证和授权

1.Spring Security 基本认证

在 Spring Boot项目中使用SpringSecurity非方便,创建一个新的 Spring Boot项目,我们只需要引入Web和 Spring Security依赖即可。

新建一个springboot工程,pom里添加springsecurity的依赖。

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

引入 Spring Security依赖后,项目中的所有接口就都被保护起来了,此时访问接口就可以看到登录页面了。

在不进行配置的情况下,默认拦截所有的请求

2.Spring Security 认证流程分析

image.png

AuthenticationManager

AuthenticationManager是一个认证管理器,它定义了 Spring Security过滤器要如何执行认证操作。AuthenticationManager是一个接口,它有着诸多的实现类,开发者也可以自定义 Authentication Manager的实现类,不过在实际应用中,我们使用最多的是 ProviderManager.在 Spring Security框架中,默认也是使用 ProviderManager.

添加用户自己的处理逻辑,需要实现UserDetailsService接口

自定义登录成功处理需要实现AuthenticationSuccessHandler接口,AuthenticationSuccessHandler里面只有一个onAuthenticationSuccess方法,参数有个Authentication,我们可以拿到这个Authentication 然后自定义自己的处理逻辑。springsecurity里面也是有一个默认的成功处理类 SavedRequestAwareAuthenticationSuccessHandler

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享