formLogin()的过滤链的配置
关于登入的配置,有以下几种API
loginPage("/loginPage") //自定义的 登入页面,如果不指定,springSecurity就会用自带的很丑的login页面
loginProcessingUrl()// 这是登入处理的跳转url(如果配置,相当于在登入请求中,横切入一个跳转url,也就是从一条完整的登入请求url中间,再加入一个)
// 情况1:
formLogin().defaultSuccessUrl("/success").failureUrl("/error").permitAll();
// 此时 html里的form表单的action还是默认的"login" 因为这里没有配置 loginPage()
// 而 登入成功后的跳转页面,则为/success。 注意 这里指的都是url,都要在controller中 加上一个方法
@RequestMapping("/success") // 接受defaultSuccessUrl的url
public String success(){
return "index";// 然后跳转到index.html
// 情况2:
formLogin().loginPage("/loginPage").defaultSuccessUrl("/success").failureUrl("/error").permitAll();
// 此时在 情况1的基础上, 配置了loginPage 那么默认的login的url就更改为我们自定义的"/loginPage" 即form中的action为"/loginPage" 其他不变
//此时应该在controller中加上一个方法
@RequestMapping("/loginPage")
public String loginPage(){ /*登入页面跳转*/
return "myloginPage"; // 跳转到自己定义的登入页面 此方法推崇
// 情况3: 此方法也推崇
formLogin().loginPage("/loginPage").failureUrl("/error").permitAll().successHandler(loginSuccessHandler);
// 此方法最为完整,action为"/loginPage" 失败请求为/error
// 那么问题来了,这里没有配置defaultSuccessUrl security就不知道认证成功后跳转到哪,
// 解决方法是,在自定义的 认证成功处理器中, 重定向到主页
下面贴上我的自定义登入成功处理器的代码。
需要自定义登入失败处理器,也是同理,只需要取消failureUrl("/error")的配置,转而在失败处理器中重新向到失败跳转页面即可。
@Slf4j
@Component
public class myLoginSuccessHandler implements AuthenticationSuccessHandler {
@Override
public void onAuthenticationSuccess(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Authentication authentication) throws IOException, ServletException {
User userInfo = (User) authentication.getPrincipal();
log.info("用户登入成功:{}",userInfo.toString());
httpServletResponse.sendRedirect("/index"); //跳转到成功页面
}
}
在springSecurity的配置类中,注入自定义的认证成功处理器,然后再指定使用它.successHandler(loginSuccessHandler)
@Autowired
private myLoginSuccessHandler loginSuccessHandler;
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests()
.anyRequest().authenticated()
.and().formLogin()
.loginPage("/loginPage")
//.loginProcessingUrl("/loginRequest")
/* 在配置了loginPage之后,loginProcessingUrl如果没配置,默认就是loginPage("url")的url,因此 form登入的action就等于这个 url */
/* 如果loginPage没有配置,那么 默认的url为 login */
/*.defaultSuccessUrl("/index") 因为自定义了成功处理器,处理器里重定向了登入成功的页面,所以可以注释掉了 如果没有定义认证成功处理器,则要配置defaultSuccessUrl*/
.failureUrl("/login/error").permitAll()
.successHandler(loginSuccessHandler)// 使用自定义登入成功处理器 自定义登录处理器作用:就是在登入成功的时候 打印一下log
.and().logout() /* .logoutSuccessUrl("/logoutSuccess")*/
// 默认的logoutUrl为:logout,和登入一样,如果没配置 logoutUrl 那么默认的url为 logout(用于登出的action)
// 如果配置了 logoutUrl,而没配置logoutSuccessUrl, 那么 logoutSuccessUrl的 url就 默认为 logoutUrl配置的 url值
.deleteCookies("JSESSIONID")
.logoutSuccessHandler(logoutSuccessHandler).permitAll() // 使用自定义的 logoutSuccessHandler
.and().rememberMe()
.and().csrf().disable();/*.ignoringAntMatchers("/druid/*")也可以 // csrf 导致 druid后台监控 login无反应;
.ignoringAntMatchers("/swagger-ui/*");*/
}
// 情况4:
formLogin().loginPage("/loginPage").loginProcessingUrl("/loginProcessing").defaultSuccessUrl("/success").failureUrl("/error").permitAll();
// 这个是多此一举的方法,没必要这么配,但是也能成功,就是要在controller中 为每个url配置上一个请求方法。 略了。不看这个
注销和登入的配置理解方式是同理的
logout的默认注销请求url为logout 如果我们配置了logoutUrl,则默认url就改为自定义的这个
loginPage对应于logoutUrl
loginSuccessUrl对应于logoutSuccessUrl
.successHandler(loginSuccessHandler)对应于.logoutSuccessHandler(logoutSuccessHandler)