【摘要】 一、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 认证流程分析
AuthenticationManager
AuthenticationManager是一个认证管理器,它定义了 Spring Security过滤器要如何执行认证操作。AuthenticationManager是一个接口,它有着诸多的实现类,开发者也可以自定义 Authentication Manager的实现类,不过在实际应用中,我们使用最多的是 ProviderManager.在 Spring Security框架中,默认也是使用 ProviderManager.
添加用户自己的处理逻辑,需要实现UserDetailsService接口