在上一篇中,介绍了Spring Security的默认配置。本篇持续来理解如何进行定制配置。Spring Security 默认的配置是 formLogin 和 httpBasic 两种模式,

FormLogin剖析:

formLogin 登录就是表单登录,对于未认证的申请进行拦挡,跳转到登录页,解决完登录申请之后,如果胜利则会redirect到申请拦挡之前的门路,例如(这里默认端口为80)申请http://localhost/user 如果没有登录,则会被拦挡跳转到login页面,输出用户名明码,点击登录,胜利后会redirect到http://localhost/user 门路的后果,如果间接拜访的是http://localhost/login 则胜利后会跳转到http://localhost 登录如果失败了,则会跳转到 http://localhost/login?error 的门路,而要是推出登录,申请的是http://localhost/login?logout 的门路。

httpBasic 登录是在申请header中退出认证信息,且每次申请都须要携带一个申请头为WWW-Authenticate的数据,示例为:WWW-Authenticate: Basic realm="Realm",Spring security oauth2 的用户名明码登录模式中的client\_id和client\_secret也是通过这种形式来传递给后端接口的,对于oauth2前面在做介绍,httpBasic默认的登录解决门路也是login;

默认的realm参数为Realm,查看源码可知:

            这里有一个疑难,默认配置的是formLogin和httpBasic,而且都是http://localhos/login 那为什么浏览器拜访的时候,默认是formLogin而不是httpBasic呢?

来看一下WebSecurityConfigurerAdapter的配置:

第二张图片是HttpSecurity getHttp()办法中的代码实现,从代码能够看出,图一中尽管是启用的formLogin和httpBasic两种模式的登录,然而默认的apply了DefaultLoginPageConfigurer类中的配置;

配置理解:

DefaultLoginPageConfigurer类中的代码很简略,申明了两个属性,loginPageGeneratingFilter和logoutPageGeneratingFilter,只有两个办法,覆写的init(H http)和configure(H http),H extends HttpSecurityBuilder。init(H http)配置了默认的login和logout的过滤器,并配置了csrf的相干配置,config(H http)配置了ExceptionHandlingConfigurer,并且增加默认的login和logout过滤器到http过滤器链中,代码如下:

注:图中报错代码是因为我我的项目是spring cloud gateway, 用的是webflux,所以HttpServletRequest没有。

看到过很多文章在应用security的时候都是间接把csrf配置禁用,而且有的文章中说,为了跨域应用csrf().disable(),这个我就很难了解,csrf为了避免跨站申请攻打,和跨域有毛线关系,跨域配置是cors()。

下面说到config(H)办法中,配置了ExceptionHandlingConfigurer,依据类名可想而知,这个是解决登录失败的逻辑的,通过看代码能够看到这个类中定义了拜访被回绝的解决办法和一些操作,代码如下:

其中config(H)办法覆写了SecurityConfigurerAdapter中的config(H)办法,该办法把获取到的accessDeniedHandler处理器增加了一个ExceptionTranslationFilter过滤器,并将这个过滤器给了过滤器链。

回过头来再看DefaultLoginPageGenerationFilter和DefaultLogoutPageGenerationFilter这两个过滤器都做了哪些事件。DefaultLoginPageGenerationFilter继承抽象类GenericFilterBean,GenericFilterBean实现了Filter接口,DefaultLoginPageGenerationFilter的作用就是用户没有配置登录页的时候给一个默认配置。同样的DefaultLogoutPageGenerationFilter也是一样的,具体的内容在上一篇spring security 学习和踩坑总结(入门)中大略介绍过了,详细信息查看上一篇文章。