关于java:spring-security-学习和踩坑总结表单

6次阅读

共计 1983 个字符,预计需要花费 5 分钟才能阅读完成。

在上一篇中,介绍了 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 学习和踩坑总结(入门)中大略介绍过了,详细信息查看上一篇文章。

正文完
 0