初学springSecurity登入登出404各种失败,在配置上理解的坑

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)

  • 5
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Binary H.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值