1.Spring Security核心功能
Spring Security核心功能有如下几点:
- 认证(你是谁?)
- 授权(你能干什么?)
- 攻击防护(防止伪造身份)
Spring Security开发基于表单认证主要说明:
- SpringSecurity基本原理
- 实现用户名+密码认证
- 实现手机号+短信认证(Spring Security中添加自定义身份认证方式)
2.Spring Security的基本原理
2.1 前言实例
我们做一个表单认证。我们把 认证授权代码都写在spring-security-web模块,然后在spring-security-demo里面去引用:
2.1.1 默认情况下
默认情况下,如果在classpath下有Spring Security相关的jar包的话,SpringBoot会自定为你做一些安全的配置。默认配置如下:
security:
basic:
enabled: true
我们注释掉应用里面application.yml文件的以上配置。重启服务,然后访问:http://127.0.0.1:8088/user
会弹出默认认证框,我们输入:user/启动项目时的密码,然后就会请求到接口:
上面是不满足我们企业要求的,如何覆盖掉上面的默认配置,我们使用表单登录。
2.1.2 覆盖默认条件下配置
- 定义一个web安全配置类
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 定义web安全配置类:覆盖config方法
* 1.参数为HttpSecurity
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
/**
* 定义了任何请求都需要表单认证
*/
http.formLogin()//表单登录---指定了身份认证方式
.and()
.authorizeRequests()//对请求进行授权
.anyRequest()//任何请求
.authenticated();//都需要认证
}
}
- web端请求接口:http://127.0.0.1:8088/user;自动会跳转到表单登录页面
输入用户名/密码之后;跳转到之前的接口请求上去
- 假如我们不想使用表单登录还是想用basic的登录,对应的配置如下:
@Configuration
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
/**
* 定义web安全配置类:覆盖config方法
* 1.参数为HttpSecurity
*/
@Override
protected void configure(HttpSecurity http) throws Exception {
/**
* 定义了任何请求都需要表单认证
*/
//http.formLogin()//表单登录---指定了身份认证方式
http.httpBasic()//http的basic登录
.and()
.authorizeRequests()//对请求进行授权
.anyRequest()//任何请求
.authenticated();//都需要认证
}
}
2.2 原理分析
2.2.1原理示意图分析
- Spring Security最核心的东西就是过滤器链路,所有请求都会经过Spring Security过滤器链,然后响应也会经过过滤器链返回回去
- 这些过滤器在启动时候,SpringBoot会自动把它都配置进去。我们不用去注入到Spring里面去
- Spring Security过滤器链最核心的就是以下绿色部分:他的作用就是认证用户身份。每一块代表一个过滤器,每一块都提供了一种认证方式。上面我们讲过使用表单登录和使用http登录,在这里恰好对应Username Password Authentication Filter(校验表单认证)和Basic Authentication Filter(校验http basic登录),绿色过滤器主要是检查请求是否有次过滤器校验的信息。比如:Username Password Authentication Filter会检查请求是不是登录请求,请求中是否带了用户名/密码。如果带了,就会使用用户名/密码检验,没有的话就会放过去下一个过滤器:Basic Authentication Filter校验请求头中是否有Basic开头的信息。有的话就会拿出来进行Base64解码,然后校验登录。任何一个过滤器认证了一个请求之后,会给这个请求做一个标记,表明这个请求认证成功了,下面过滤器放行即可。 4. 所有过滤器执行完毕之后,请求会到一个拦截器(FilterSecurity Interceptor),FilterSecurity Interceptor是Spring Security过滤器链上的最后一环。在他之后使我们自己写的Rest API。我们之前的配置信息都会放到FilterSecurity Interceptor中,让其做最后一个校验。过的话就进入REST API了,不过的话就会根据不能访问的原因抛出对应的异常了,对应的异常在FilterSecurity Interceptor前有一个Exception Translation Filter捕获FilterSecurity Interceptor抛出的异常,根据不同的异常做相应的处理(比如是表单登录的话,会根据需要用户名/密码登录的异常将其引导到表单页面进行输入登录信息)。
注意:上面过滤器链上,绿色的部分可以我们通过配置来决定某个过滤器是否生效了。比如上面我们不配置http.httpBasic()那么Basic Authentication Filter就不会生效。其他过滤器我们是不能控制的。他们一定会在过滤器链路上,并且其位置也是不能更改的。
2.2.2 原理断电调试
我们在上面的过滤器上及REST API打上断点。
UserController接口打断点:
FilterSecurityInterceptor断点:
ExceptionTranslationFilter的doFilter断点:
UsernamePasswordAuthenticationFilter的attemptAuthentication断点:
我们页面请求:
http://127.0.0.1:8088/user
首先会进入:
然后调试会进入:Exception Translation Filter
然后进入我们登录页面:
输入用户名/密码 点击登录
进入:UsernamePasswordAuthenticationFilter
然后又进入:FilterSecurity Interceptor
再下一步进入我们接口逻辑。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。