spring security
Spring Security是一个功能强大且高度可定制的身份验证和访问控制框架。它是用于保护基于Spring的应用程序的事实上的标准。
提供了完整的安全性解决方案,能够在web请求级别(servlet)和方法调用级别(spring AOP)处理身份证验证和授权。
springsecurity手册:https://www.springcloud.cc/spring-security-zhcn.html
核心功能
认证 (你是谁)
授权 (你能干什么)
攻击防护 (防止伪造身份)
其核心就是一组过滤器链,项目启动后将会自动配置。最核心的就是 Basic Authentication Filter 用来认证用户的身份,一个在spring security中一种过滤器处理一种认证方式。
原理
Spring Security是Java web的一个认证(Authentication)/授权(Authorisation)框架,基于Servlet的Filter技术。
-
servelet
Servlet技术是Java web开发的底层使能性技术,Struts的 ActionServlet和Spring MVC的DispatcherServlet等web开发框架 都是建立在servlet基础之上的。servlet是web请求的基本单元, filter围绕着servlet,用于在web请求被处理之前或之后对web请 求(Request)和应答(Response)修改。参考图见: https://www.jianshu.com/p/a41a8f09b811
要使Spring Security生效,需要有一个Spring Security的Filter能够被Servlet容器(比如Tomcat、Jetty等)感知到,这个Filter便是DelegatingFilterProxy,该Filter不受Spring IoC容器的管理,也不是Spring Security引入的,而是Spring Framework中的一个通用的Filter。在Servlet容器眼中,DelegatingFilterProxy只是一个Filter而已,跟其他的Servlet Filter没什么区别。
DelegatingFilterProxy本身不在IoC容器中,它却能够访问到IoC容器中的其他对象。
-
注意:
Spring Boot会自动将实现了javax.servlet.Filter的Filter自动注册进Servelt容器
此时可以通过以下方式来禁止自动注册:@Bean(name = "authenticationFilterRegistration") public FilterRegistrationBean myAuthenticationFilterRegistration(final MyAuthenticationFilter filter) { final FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(); filterRegistrationBean.setFilter(filter); filterRegistrationBean.setEnabled(false); return filterRegistrationBean; }
DelegatingFilterProxy只是起代理作用,将真正的逻辑代理给其他的被Spring IoC容器管理的对象。
DelegatingFilterProxy会将名字springSecurityFilterChain赋值给targetBeanName字段,然后从IoC容器中找到名字为targetBeanName值(此时也springSecurityFilterChain)的bean,并将逻辑代理给该bean。
Spring Security默认会自动创建名字为springSecurityFilterChain的bean,该Bean为一个FilterChainProxy类型的对象,该对象其实也只是起代理作用
FilterChainProxy维护了多个SecurityFilterChain,每一个SecurityFilterChain只会对特定的Request起作用(比如特定的URL),FilterChainProxy在接收到Request时,会从SecurityFilterChain列表中选出能够处理该Request的那个SecurityFilterChain对象,然后将逻辑代理给该对象。
SecurityFilterChain其实也不是最终完成Spring Security认证逻辑的对象,而是维护了多个Filter bean,这些Filter bean才是真正处理认证逻辑的对象。
有些Filter bean在Spring Security中是必须的,Spring Security会自动为我们创建并配置这些bean,比如用于鉴权的FilterSecurityInterceptor,另外,我们也可以将自己的Filter bean加入Filter bean列表中,比如完成基于Token的认证机制。
-
关键filter
ChannelProcessingFilter-用于将HTTP请求重定向到HTTPS页面 SecurityContextPersistenceFilter-保存用户的登录状态 UsernamePasswordAuthenticationFilter-用于处理基于Form登录的认证,认证成功重定向到指定页面,认证失败向用户重新返回登录界面并提示错误。 UsernamePasswordAuthenticationFilter继承自AbstractAuthenticationProcessingFilter AbstractAuthenticationProcessingFilter并不完成认证逻辑,而是将其交给AuthenticationManager, AuthenticationManager进而代理给AuthenticationProvider, AuthenticationProvider验证用户提供的凭证是否正确 ExceptionTranslationFilter和FilterSecurityInterceptor-这两个Filter通常是结合在一起用的,前者负责处理后者所抛出的异常并做相应的处理,后者主要用于鉴权。