spring security 登出操作 详细说明

摘要:
1.这里的前言专门介绍了springsecurity注销操作2的详细记录。操作(1)目录结构(2)将注销支持源代码包com.example.security5500.securityConfig添加到安全拦截规则配置文件中;importorg.springframework.beans.factory.annotation.Autowired;进口弹簧
1.前言

这里专门 做 spring security 登出操作 的  详细记录

 2.操作

(1)目录结构

spring security 登出操作 详细说明第1张

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

spring security 登出操作 详细说明第2张

 源码

spring security 登出操作 详细说明第3张spring security 登出操作 详细说明第4张
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();
    }


}
View Code

(3)前端以表单的形式登出

spring security 登出操作 详细说明第5张

3.测试

启动后,

spring security 登出操作 详细说明第6张

 直接 点击 登出即可 

如果把不配置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 登出操作 详细说明》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇TypeScript ES6-Promise 递归遍历文件夹中的文件react踩坑-各种异常解决方案下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

将Kafka收到的数据传入到redis中

首先,配置配置。在属性测试中,首先启动网络管理系统(GateWay),然后启动终端(TBox),然后运行KafkaTest启动TBox。在启动测试中可以看到收到的数据。然后关键是sdf,然后去你的xshell启动动物园管理员、kafka和redis...

Json 的日期格式转化(时区标准化)

在JavaScript中,这无疑可以通过初始化Data()对象//converttomsecsinceJan11970localTime=d轻松完成。获取时间();步骤2:接下来,通过Data()对象的getTimezoneOffset()方法//obtainlocalUTCoffsetandconverttomseclocalOffset=d找出本地时间偏...

iTerm2 配色方案(转)

ITerm2配色方案(噢,我的zsh&Powerline)item2.png转到官方网站下载ITerm2,并以全黑色背景打开它。屏幕截图2017-08-01下午5.45.28点。Pngsolarized可以说是目前网络上最流行的配色方案,我个人认为比较这种配色更好。第一种方法:打开iTerm2首选项、配置文件/颜色,然后直接选择Solariz...

dBFs和dBm

dBFs和dBmdBFs是用来表征数字域功率值的大小,一般情况下我们定义0dBFs为数字域满刻度功率值,即数字域中功率的最大值;因此看到的dBFs的值都是负的。...

[转]从minio中读取文件流进行下载文件

本文转自:https://blog.csdn.net/ZHANGLIZENG/article/details/82892678一、获取Minio连接publicstaticStringminioUrl;publicstaticStringminioUsername;publicstaticStringminioPassword;@Value("${syste...

Navicat数据存放位置和备份数据库路径设置

navicat数据库存储在哪里?有了这样的问题,让我们来解决这个问题。默认情况下安装Navicat,默认情况下也安装MySQL,数据库存储在默认用户的目录中。选择安装目录时,还可以选择数据的位置。很多人此时只是设置了MySQL的安装位置。...