@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
 
  	...
  
		//如果你学习过SpringSecurity 5.X版本,可能会发现新版本的配置方式完全不一样
    //新版本全部采用lambda形式进行配置,无法再使用之前的and()方法进行连接了
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                //以下是验证请求拦截和放行配置
                .authorizeHttpRequests(auth -> {
	                auth.requestMatchers("/static/**").permitAll();   //将所有的静态资源放行,一定要添加在全部请求拦截之前
                    auth.anyRequest().authenticated();    //将所有请求全部拦截,一律需要验证
                })
                //以下是表单登录相关配置
                .formLogin(conf -> {
                    conf.loginPage("/login");   //将登录页设置为我们自己的登录页面
                    conf.loginProcessingUrl("/doLogin"); //登录表单提交的地址,可以自定义,并且login页表单的action地址需要和此处一致
                    conf.defaultSuccessUrl("/");   //登录成功后跳转的页面
                    conf.permitAll();    //将登录相关的地址放行,否则未登录的用户连登录界面都进不去
                  	//用户名和密码的表单字段名称,不过默认就是这个,可以不配置,除非有特殊需求
                    conf.usernameParameter("username");
                    conf.passwordParameter("password");
                })
                .build();
    }
}

需要配置登陆页面的地址和登陆请求发送的地址,这里登陆页面填写为/login,登陆请求地址为/doLogin,登陆页面我们刚刚已经自己编写Controller来实现了,登陆请求提交处理由SpringSecurity提供,只需要写路径就可以了。

并且需要把获取静态资源的请求给放行,不然给出现302错误。

配置退出登录

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
 
    ...
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                ...
                //以下是退出登录相关配置
                .logout(conf -> {
                    conf.logoutUrl("/doLogout");   //退出登录地址,跟上面一样可自定义
                    conf.logoutSuccessUrl("/login");  //退出登录成功后跳转的地址,这里设置为登录界面
                    conf.permitAll();
                })
                .build();
    }
}

配置记住我

SpringSecurity为我们提供了一种优秀的实现,它为每个已经登陆的浏览器分配一个携带Token的Cookie,并且此Cookie默认会被保留14天,只要我们不清理浏览器的Cookie,那么下次携带此Cookie访问服务器将无需登陆,直接继续使用之前登陆的身份,这样显然比我们之前的写法更加简便。并且我们需要进行简单配置,即可开启记住我功能:

@Configuration
@EnableWebSecurity
public class SecurityConfiguration {
 
    ...
 
    @Bean
    public SecurityFilterChain filterChain(HttpSecurity http) throws Exception {
        return http
                ...
                .rememberMe(conf -> {
                    conf.alwaysRemember(false);  //这里不要开启始终记住,我们需要配置为用户自行勾选
                    conf.rememberMeParameter("remember-me");   //记住我表单字段,默认就是这个,可以不配置
                    conf.rememberMeCookieName("xxxx");  //记住我设置的Cookie名字,也可以自定义,不过没必要
                })
                .build();
    }
}

配置完成后,我们需要修改一下前端页面中的表单,将记住我勾选框也作为表单的一部分进行提交:

<div class="ad-checkbox">
    <label>
        <input type="checkbox" name="remember-me" class="ad-checkbox">
        <span>Remember Me</span>
    </label>
</div>

由于记住我信息是存放在内存中的,我们需要保证服务器一直处于运行状态,如果关闭服务器的话,记住我信息会全部丢失,因此,如果我们希望记住我能够一直持久化保存,我们就需要进一步进行配置。