spring security 登出操作 详细说明
1.前言
这里专门 做 spring security 登出操作 的 详细记录
2.操作
(1)目录结构

(2)在security 拦截规则配置文件添加退出登录支持

源码
package com.example.security5500.securityConfig; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.crypto.factory.PasswordEncoderFactories;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.provisioning.InMemoryUserDetailsManager; //@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { @Autowired
private DbUserDetailsService dbUserDetailsService; //拦截规则设置
@Override
protected void configure(HttpSecurity http) throws Exception {
// http
// .authorizeRequests()
// // 匹配 "/" 路径,不需要权限即可访问
// .antMatchers("/").permitAll()
// //匹配 "/user" 及其以下所有路径,都需要 "USER" 权限
//// .antMatchers("/user/**").hasAuthority("USER")
// .and()
// //登录地址为 "/login",登录成功默认跳转到页面 "/hai"
// .formLogin().loginPage("/login").defaultSuccessUrl("/hai")
// //退出登录的地址为 "/logout",退出成功后跳转到页面 "/login"
// .and()
// //退出登录的地址为 "/logout",退出成功后跳转到页面 "/login"
// .logout().logoutUrl("/logout").logoutSuccessUrl("/login");
// // 默认启用 CSRF ,必须post才可以访问/logout
http
//允许基于使用HttpServletRequest限制访问
.authorizeRequests()
//设置不拦截页面,可直接通过,路径访问 "/", "/index", "/home" 则不拦截,
//"/hhk/**" 的意思是 "/hhk" 及其以下所有路径
.antMatchers("/", "/index", "/home","/hhk/**")
//是允许所有的意思
.permitAll()
//其他页面都要拦截,【需要在最后设置这个】
.anyRequest().authenticated()
.and()
//设置自定义登录页面
.formLogin()
//指定自定义登录页面的访问虚拟路径
.loginPage("/login")
.permitAll()
.and()
// 添加退出登录支持。当使用WebSecurityConfigurerAdapter时,这将自动应用。默认情况是,访问URL”/ logout”,使HTTP Session无效
// 来清除用户,清除已配置的任何#rememberMe()身份验证,清除SecurityContextHolder,然后重定向到”/login?success”
.logout()
// //指定的登出操作的虚拟路径,需要以post方式请求这个 http://localhost:5500/mylogout 才可以登出 ,也可以直接清除用户认证信息达到登出目的
.logoutUrl("/mylogout")
//登出成功后访问的地址
.logoutSuccessUrl("/home");
// .permitAll();
} /**
* 添加 UserDetailsService, 实现自定义登录校验
*/
@Override
protected void configure(AuthenticationManagerBuilder builder) throws Exception {
//注入用户信息,每次登录都会来这查询一次信息,因此不建议每次都向mysql查询,应该使用redis
builder.userDetailsService(dbUserDetailsService);
} /**
* 密码加密
*/
@Bean
public static PasswordEncoder passwordEncoder() {
return NoOpPasswordEncoder.getInstance();
} }
(3)前端以表单的形式登出

3.测试
启动后,

直接 点击 登出即可
如果把不配置security 的拦截规则 ,将会默认使用get 方式 请求 /logout 来登出 ,会进入一个界面 ,需要鼠标点击
4.后端自定义登出
package com.example.security5500.controller; import org.springframework.security.core.Authentication;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping; import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; @Controller
public class UserController { //登出操作
@RequestMapping({"/doLogout"})
public String logout(HttpServletRequest request, HttpServletResponse response) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null) {//清除认证
new SecurityContextLogoutHandler().logout(request, response, auth);
}
//重定向到指定页面
return "redirect:/login";
} }
请求这个也可以登出 ,原理是获取授权对象然后清除认证,再重定向到指定页面
spring security 登出操作 详细说明的更多相关文章
- Spring boot 前后台分离项目 怎么处理spring security 抛出的异常
最近在开发一个项目 前后台分离的 使用 spring boot + spring security + jwt 实现用户登录权限控制等操作.但是 在用户登录的时候,怎么处理spring securi ...
- spring boot security 登出
<!DOCTYPE html> <html lang="zh-cn" xmlns:th="http://www.thymeleaf.org" ...
- django 使用其自带的验证系统 进行用户名有效性验证 登录状态验证 登入操作 登出操作
from django.shortcuts import render, redirect from django.contrib.auth import authenticate, login, l ...
- 【Spring】关于Boot应用中集成Spring Security你必须了解的那些事
Spring Security Spring Security是Spring社区的一个顶级项目,也是Spring Boot官方推荐使用的Security框架.除了常规的Authentication和A ...
- Spring Boot中集成Spring Security 专题
check to see if spring security is applied that the appropriate resources are permitted: @Configurat ...
- spring security集成cas实现单点登录
spring security集成cas 0.配置本地ssl连接 操作记录如下: =====================1.创建证书文件thekeystore ,并导出为thekeystore.c ...
- spring security 动态 修改当前登录用户的 权限
1.前言 spring security 可以获取当前登录的用户信息,同时提供了接口 来修改权限列表信息 , 使用这个方法 ,可以动态的修改当前登录用户权限. 那么问题来了... 如果我是管理员 ,如 ...
- spring security 自动登录 --- 心得
1.前言 仍然是使用cookie存储登录数据,但是存储的数据 由 spring security自动创建 ,当登出后自动删除cookie, 如果不登出也仍在生命周期内,关闭浏览器再打开将会自动登录,无 ...
- 学习Spring Boot:(二十八)Spring Security 权限认证
前言 主要实现 Spring Security 的安全认证,结合 RESTful API 的风格,使用无状态的环境. 主要实现是通过请求的 URL ,通过过滤器来做不同的授权策略操作,为该请求提供某个 ...
随机推荐
- 使用beanUtils封装对象的servlet
package com.hopetesting.web.servlet;import com.hopetesting.dao.UserDao;import com.hopetesting.domain ...
- JSP中声明变量、方法
在JSP页面中声明局部变量,全局变量,方法等 代码示例: <%@ page language="java" contentType="text/html; char ...
- maven依赖对zookeeper的版本冲突问题
我用的是springcloudAlibaba+zookeeper zookeeper下载后 1,修改配置文件,conf目录下的zoo_sample.cfg修改为zoo.cfg. 2,打开zoo.cfg ...
- 11、Redis的配置文件
Redis的配置文件 一.Redis配置文件简介 Redis是通过配置文件启动的 Redis对大小写字母不敏感 Redis基本上环境搭建都在配置文件 关于Redis配置文件位置是安装时放的位置,关于R ...
- python之异步编程
一.异步编程概述 异步编程是一种并发编程的模式,其关注点是通过调度不同任务之间的执行和等待时间,通过减少处理器的闲置时间来达到减少整个程序的执行时间:异步编程跟同步编程模型最大的不同就是其任务的切换, ...
- 记录一次成功CICD完整亲身实践从此踏进入Devops大门
Devops概念 DevOps 强调通过一系列手段来实现既快又稳的工作流程,使每个想法(比如一个新的软件功能,一个功能增强请求或者一个 bug 修复)在从开发到生产环境部署的整个流程中,都能不断地为用 ...
- 估计工期标识(Project)
<Project2016 企业项目管理实践>张会斌 董方好 编著 有时候吧,我们遇到的任务,工期并不是那么好定的,本来嘛,一个项目如果全靠拍脑袋,最后搞不好会被人锤脑袋-- 看来PM有风险 ...
- TensorFlow.NET机器学习入门【1】开发环境与类型简介
项目开发环境为Visual Studio 2019 + .Net 5 创建新项目后首先通过Nuget引入相关包: SciSharp.TensorFlow.Redist是Google提供的TensorF ...
- CF1443A Kids Seating 题解
Content 有 \(t\) 组询问,每组询问给定一个数 \(n\),试构造出一个长度为 \(n\) 的数列 \(\{a_i\}_{i=1}^n\),使得: \(\forall i\in[1,n], ...
- MVC中的打印功能
HTML页面: @{ Layout = "~/Views/Shared/_IframeLayout.cshtml";}@Scripts.Render(ViewBag.ScriptP ...