SpringSecurity基本原理

187 阅读3分钟

一、快速入门

首先,要想让一个系统的登录流程走SpringSecurity框架的逻辑,那么首先需要先写一个类去继承WebSecurityConfigurerAdapter,然后重写里面的configure方法,这个时候如果不做任何配置,去访问服务器中的任意接口的时候都会弹出一个alert框去输入一个用户名和密码。如下图:

\

15200008-918bf4b0092d7fa8.png

alert输入用户名密码


默认的,我们可以输入user当做用户名,密码我们可以在控制台中的日志看到

15200008-f317467450bddcf6.png

SpringSecurity的密码


输入此密码,我就可以正常访问到我系统中的接口资源\

15200008-cb27910fec7e68de.png

访问接口资源

\

可以看到,如果使用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任何请求都要去进行授权认证。然后访问本地服务:

\

15200008-44d830fdde43f3be.png

login

\

可以看到系统进入到了一个表单提交的页面,当我们重新输入控制台中的密码时,系统会自动重定向到我们起始输入的url上边去。如果我要想不用表单登录的方式,可以将第一行改为httpBasic即可

 http.httpBasic()

三、认证原理

15200008-545f402fe2355967.png

认证原理

\

其中,表单登录只是其中的一种过滤方式,httpBasic这种过滤方式是在表单登录之后,类似于责任链模式,除了这两种方式SpringSecurity还支持很多种过滤方式。当请求通过这些绿色的过滤器之后,请求会进入到FilterSecurityInterceptor适配器上,这个是整个SpringSecurity过滤器的最后一环,是最终的守门人,它会去决定请求最终能否去访问到我们的Rest服务,那它依据什么区判断的呢?就是依据我们代码中写的后五行(对请求进行授权,然后对系统中的anyRequest任何请求都要去进行授权认证),这些规则都会被放到
FilterSecurityInterceptor中,当认证成功则可以访问资源,如果认证失败,就会根据失败原因抛出相应的异常,进入到ExceptionTranslationFilter中,这个过滤器根据这些异常会做出相应的处理。
注意:

在这一系列过滤器链中,绿色的过滤器可以通过配置去完成自定义配置,蓝色及黄色是不能控制的。它们一定都会生效且位置固定。(ExceptionTranslationFilter一定在FilterSecurityInterceptor之前)