1. 前言
前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication
),认证的第一步就是登录。今天我们要通过对 Spring Security 的自定义,来设计一个可扩展,可伸缩的 form 登录功能。
2. form 登录的流程
下面是 form 登录的基本流程:
只要是 form 登录基本都能转化为上面的流程。接下来我们看看 Spring Security 是如何处理的。
3. Spring Security 中的登录
昨天 Spring Security 实战干货:自定义配置类入口WebSecurityConfigurerAdapter 中已经讲到了我们通常的自定义访问控制主要是通过 HttpSecurity
来构建的。默认它提供了三种登录方式:
formLogin()
普通表单登录oauth2Login()
基于OAuth2.0
认证/授权协议openidLogin()
基于OpenID
身份认证规范
以上三种方式统统是 AbstractAuthenticationFilterConfigurer
实现的,
4. HttpSecurity 中的 form 表单登录
启用表单登录通过两种方式一种是通过 HttpSecurity
的 apply(C configurer)
方法自己构造一个 AbstractAuthenticationFilterConfigurer
的实现,这种是比较高级的玩法。 另一种是我们常见的使用 HttpSecurity
的 formLogin()
方法来自定义 FormLoginConfigurer
。我们先搞一下比较常规的第二种。
4.1 FormLoginConfigurer
该类是 form 表单登录的配置类。它提供了一些我们常用的配置方法:
loginPage(String loginPage)
: 登录 页面而并不是接口,对于前后分离模式需要我们进行改造 默认为/login
。loginProcessingUrl(String loginProcessingUrl)
实际表单向后台提交用户信息的Action
,再由过滤器UsernamePasswordAuthenticationFilter
拦截处理,该Action
其实不会处理任何逻辑。usernameParameter(String usernameParameter)
用来自定义用户参数名,默认username
。passwordParameter(String passwordParameter)
用来自定义用户密码名,默认password
failureUrl(String authenticationFailureUrl)
登录失败后会重定向到此路径, 一般前后分离不会使用它。failureForwardUrl(String forwardUrl)
登录失败会转发到此, 一般前后分离用到它。 可定义一个Controller
(控制器)来处理返回值,但是要注意RequestMethod
。defaultSuccessUrl(String defaultSuccessUrl, boolean alwaysUse)
默认登陆成功后跳转到此 ,如果alwaysUse
为true
只要进行认证流程而且成功,会一直跳转到此。一般推荐默认值false
successForwardUrl(String forwardUrl)
效果等同于上面defaultSuccessUrl
的alwaysUse
为true
但是要注意RequestMethod
。