一、快速入门
首先,要想让一个系统的登录流程走SpringSecurity框架的逻辑,那么首先需要先写一个类去继承WebSecurityConfigurerAdapter,然后重写里面的configure方法,这个时候如果不做任何配置,去访问服务器中的任意接口的时候都会弹出一个alert框去输入一个用户名和密码。如下图:
alert输入用户名密码
默认的,我们可以输入user当做用户名,密码我们可以在控制台中的日志看到 SpringSecurity的密码
输入此密码,我就可以正常访问到我系统中的接口资源
访问接口资源
可以看到,如果使用SpringSecurity框架,该框架会默认自动地替我们将系统中的资源进行保护,每次访问资源的时候都必须经过一层身份的校验,如果通过了则重定向到我们输入的url中,否则访问是要被拒绝的。
二、改善代码
我们知道,SpringSecurity默认地是弹出一个alert框去提示用户进行身份校验的,但是在实际的开发中我们不可能会用这种方式,因此,我们需要对代码进行一定的改善。
首先,我新建一个类BrowserSecurityConfig,去继承WebSecurityConfigurerAdapter,该类是springSecurity提供的一个适配器类然后去重写里面的configure方法(注意参数是HttpSecurity)代码如下:
@Configuration
public class BrowserSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
//实现的效果:让它去表单登录,而不是alert框
http.formLogin()
.and()
.authorizeRequests()//对请求进行授权
.anyRequest()//任何请求
.authenticated();
}
}
在这个方法里面,通过这一行,可以实现SpringSecurity走form表单去进行登录认证,后三行的意思是我要对请求进行授权,然后对系统中的anyRequest任何请求都要去进行授权认证。然后访问本地服务:
login
可以看到系统进入到了一个表单提交的页面,当我们重新输入控制台中的密码时,系统会自动重定向到我们起始输入的url上边去。如果我要想不用表单登录的方式,可以将第一行改为httpBasic即可
http.httpBasic()
三、认证原理
认证原理其中,表单登录只是其中的一种过滤方式,httpBasic这种过滤方式是在表单登录之后,类似于责任链模式,除了这两种方式SpringSecurity还支持很多种过滤方式。当请求通过这些绿色的过滤器之后,请求会进入到FilterSecurityInterceptor适配器上,这个是整个SpringSecurity过滤器的最后一环,是最终的守门人,它会去决定请求最终能否去访问到我们的Rest服务,那它依据什么区判断的呢?就是依据我们代码中写的后五行(对请求进行授权,然后对系统中的anyRequest任何请求都要去进行授权认证),这些规则都会被放到
FilterSecurityInterceptor中,当认证成功则可以访问资源,如果认证失败,就会根据失败原因抛出相应的异常,进入到ExceptionTranslationFilter中,这个过滤器根据这些异常会做出相应的处理。
注意:
在这一系列过滤器链中,绿色的过滤器可以通过配置去完成自定义配置,蓝色及黄色是不能控制的。它们一定都会生效且位置固定。(ExceptionTranslationFilter一定在FilterSecurityInterceptor之前)
网友评论