跳到主要内容

17--注销登录的实现及原理分析

前言

经过前面几个章节的学习,一一哥 已经带各位实现了两种方式的自动登录。咱们现在已经学会了如何自动登录,那么又该如何退出登录呢?接下来请再跟着 壹哥 把注销登录功能也实现一下吧。

一. 注销登录

1. 代码实现

我们直接在之前案例的基础上进行代码实现,这里还是在SecurityConfig类中配置,其实退出登录功能的实现很简单。

@EnableWebSecurity(debug = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Value("${spring.security.remember-me.key}")
private String rememberKey;

@Autowired
private DataSource dataSource;

@Autowired
private UserDetailsService userDetailsService;

@Override
protected void configure(HttpSecurity http) throws Exception {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource);

http.authorizeRequests()
.antMatchers("/admin/**")
.hasRole("ADMIN")
.antMatchers("/user/**")
.hasRole("USER")
.antMatchers("/app/**")
.permitAll()
.anyRequest()
.authenticated()
.and()
.formLogin()
.permitAll()
.and()
//开启记住我功能
.rememberMe()
.userDetailsService(userDetailsService)
//1.散列加密方案
.key(rememberKey)
//2.持久化令牌方案
.tokenRepository(tokenRepository)
//7天有效期
.tokenValiditySeconds(60 * 60 * 24 * 7)
.and()
//配置退出登录功能
.logout()
//关联自己的退出登录接口
.logoutUrl("/user/logout")
//注销成功,重定向到该路径下
.logoutSuccessUrl("/login")
//与logoutSuccessUrl处理策略类似,但更灵活.
//.logoutSuccessHandler(new LogoutSuccessHandler() {
// @Override
// public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
//处理成功退出登录后的业务
// }
//})
//.addLogoutHandler(new LogoutHandler() {
// @Override
// public void logout(HttpServletRequest request, HttpServletResponse response, Authentication authentication) {
//处理退出登录业务
// }
//})
//使得session失效
.invalidateHttpSession(true)
//清除认证信息
.clearAuthentication(true)
//删除指定的cookie
.deleteCookies("cookie01","cookie02")
.and()
.csrf()
.disable();
}

@Bean
public PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
}

}