本文内容为本书第六章《SpringBoot的Security安全掌握》
Spring Security框架简介Spring Security是安全访问掌握框架,紧张两个功能:
在Spring Boot中配置Security须要创建一个类继续WebSecurityConfigurerAdapter,利用@EnableWebSecurity表明,重写config方法实现配置,

WebSecurityConfigurerAdapter是一个适配器,实现了WebSecurityConfigurer接口,供应两个方法
configurer(HttpSecurity httpSecurity)方法可以通过HttpSecurity的authorizeRequest()方法定义哪些URL须要被保护,哪些不须要;通过formLogin()方法定义当须要用户上岸时,跳转到的上岸页面
用户认证Spring Security通过configureGlobal(AuthenticationManagerBuilder auth)完成用户认证。利用AuthenticationManagerBuilder的inMemoryAuthentication()方法可以添加用户,并指定权限。
如下图:
权限默认利用“ROLE_”前缀,以是实际权限是“ROLE_ADMIN”
用户授权Spring Security通过configure(HttpSecurity http)完成用户授权。
HttpSecurity的authorizeRequests()方法有多个子节点,每个matcher按照他们的顺序实行,指定用户可以访问的多个URL模式。
antMatchers利用Ant风格匹配路径regexMatchers利用正则表达式匹配路径Security供应的安全处理方法如下:
举例如下:
也可以设置上岸行为
Spring Security核心类
(1)Authentication
Authentication用来表示用户认证信息,在用户上岸前,Security会将干系信息封装为一个Authentication工具,上岸成功后会天生一个信息更全面的用户信息Authentication工具,然后把它保存在SecurityContextHolder所持有的SecurityContext中,供后续调用。
(2)SecurityContextHolder
SecurityContextHolder是用来保存SecurityContext的,SecurityContext含有用户信息。默认SecurityContextHolder利用ThreadLocal来保存SecurityContext。
开拓过程中获取当前用户的干系信息,比如用户名。举例如下:
String username = SecurityContextHolder.getContext().getAuthentication().getName();
(3)UserDetails
UserDetails接口定义了一些可以获取用户名、密码、权限即是认证干系的信息的方法。
(4)UserDetailsService
Authentication.getPrincipla()返回类型是Object,本色是一个UserDetails实例。认证时会通过UserDetailsService的loadUserByUsername()方法获取对应的UserDetails进行认证,认证后会将该UserDetails赋给认证通过的Authentication的principal,然后存入SecurityContext。
(5)GrantedAuthority
Authentication的getAuthorities()可以返回当前Authentication工具拥有的权限。返回值是一个GrantedAuthority类型的数组,每一个GrantedAuthority工具代表当前用户的一个权限。
(6)DaoAuthenticationProvider
Security默认利用DaoAuthenticationProvider实现AuthenticationProvider接口,用于进行用户认证的处理。DaoAuthenticationProvider在进行认证时须要一个UserDetailsService来获取用户的信息UserDetails。
(7)PasswordEncoder
Security对密码的加密都是由PasswordEncoder来完成的。加密办法包括MD5、SHA-256等。DaoAuthenticationProvider中有一个PasswordEncoder属性,密码加密功能紧张靠它来完成。
Spring Security验证机制Security是由一堆Filter实现的,Filter会在SpringMVC前拦截要求。Filter报货登出Filter(LogoutFilter)、用户名密码验证Filter(UsernamePasswordAuthenticationFilter)。Filter再交由其他组件完成细分功能,最常用的UsernamePasswordAuthenticationFilter会持有一个AuthenticationManager引用,AuthenticationManager是一个验证管理器,专门卖力验证,但AuthenticationManager本身不做详细验证事情,AuthenticationManager持有一个AuthenticationProvider凑集,AuthenticationProvider才是做验证事情的组件,验证成功或失落败后调用对应的Handler。
SpringBoot的支持(1)通过org.springframework.boot.autoconfigure.security包对Spring Security供应了自动配置支持,紧张通过SecurityAutoConfiguration和SecurityProperties两个类来完成自动配置。
自动的配置如下:
(2)SpringBoot自动配置一个DefaultSecurityFilterChain过滤器,用来忽略/css/、/js/、/images/、/webjars/、//favicon.ico、/error等文件的拦截
(3)SpringBoot自动注册Security过滤器
Spring Security开拓步骤(1)修正pom文件
(2)开拓页面
用于上岸并提交username和password
(3)创建Security认证处理类
密码处理类:
用户认证和授权处理类:
(4)创建认证成功处理类
用来处理用户认证授权并跳转到指定URL
(5)编写要求掌握器