系列四、Spring Security中的认证 授权(前后端不分离)

一、Spring Security中的认证 & 授权(前后端不分离)

1.1、MyWebSecurityConfigurerAdapter

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/11 21:50
 * @Description:
 */
@Configuration
public class MyWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {

    /**
     * 密码加密器
     * @return
     */
    @Bean
    PasswordEncoder passwordEncoder() {
        return NoOpPasswordEncoder.getInstance();
    }

    /**
     * 配置基于内存的用户
     * @param auth
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication()
                .withUser("admin")
                .password("123456")
                .roles("admin")

                .and()

                .withUser("root")
                .password("123456")
                .roles("root");
    }

    /**
     * 静态资源过滤
     * @param web
     * @throws Exception
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/js/**", "/css/**","/images/**");
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
                .antMatchers("/helloWorld")
                .permitAll()
                .anyRequest()
                .authenticated()

                .and()

                .formLogin()
                /**
                 * 自定义登录页面,覆盖Spring Security默认的登录页
                 * 仅仅配置loginPage("/login.html")其实对应两个请求,即:
                 *      GET:http://localhost:7001/login.html,用来获取登录页面
                 *      POST:http://localhost:7001/login.html,处理登录请求
                 * 也可以将登录页面和处理登录请求分开配置,如下:
                 */
                .loginPage("/login.html")
                .loginProcessingUrl("/login")
                /**
                 * 登录成功回调:
                 *      defaultSuccessUrl("/login/successGET")
                 *      successForwardUrl("/login/successPOST")
                 */
                .defaultSuccessUrl("/login/successGET")
                /**
                 * 登录失败回调:
                 *      failureUrl("/login/failGET")
                 *      failureForwardUrl("/login/failPOST")
                 */
                .failureForwardUrl("/login/failPOST")

                .and()

                /**
                 * 注销登录配置
                 *     1、默认注销的 URL 是 /logout,是一个 GET 请求,我们可以通过 logoutUrl 方法来修改默认的注销 URL
                 *     2、logoutRequestMatcher 方法不仅可以修改注销 URL,还可以修改请求方式,实际项目中,这个方法和 logoutUrl 任意设置一个即可
                 *          .logoutRequestMatcher(new AntPathRequestMatcher("/logout","POST"))
                 *     3、logoutSuccessUrl 表示注销成功后要跳转的页面
                 *     4、deleteCookies 用来清除 cookie
                 *     5、clearAuthentication 和 invalidateHttpSession 分别表示清除认证信息和使 HttpSession 失效,默认可以不用配置,默认就会清除
                 */
                .logout()
                .logoutUrl("/logout")
                .logoutSuccessUrl("/login.html")
                .deleteCookies()
                .clearAuthentication(true)
                .invalidateHttpSession(true)
                .permitAll()

                .and()

                .csrf()
                .disable();
    }

}

1.2、LoginController

/**
 * @Author : 一叶浮萍归大海
 * @Date: 2024/1/11 22:37
 * @Description: 登录成功 & 失败 & 注销登录相关配置
 */
@RequestMapping("/login")
@RestController
public class LoginController {

    @GetMapping("/successGET")
    public R successGET() {
        return R.ok().data("登录成功【GET】");
    }

    @PostMapping("/successPOST")
    public R successPOST() {
        return R.ok().data("登录成功【POST】");
    }

    @GetMapping("/failGET")
    public R failGET() {
        return R.error().data("登录失败【GET】");
    }

    @PostMapping("/failPOST")
    public R failPOST() {
        return R.error().data("登录失败【POST】");
    }

    @GetMapping("/logoutGET")
    public R logoutGET() {
        return R.ok().data("注销成功【GET】");
    }

    @PostMapping("/logoutPOST")
    public R logoutPOST() {
        return R.ok().data("注销成功【POST】");
    }

}

1.3、登录成功回调

1.3.1、概述

        前后端不分离的登录成功回调有两个关键方法,即:defaultSuccessUrl 和 successForwardUrl。那么它们之间的区别是什么呢?       

(1)successForwardUrl 表示不管你是从哪里来的,登录后一律跳转到 successForwardUrl 指定的地址。例如 successForwardUrl 指定的地址为/login/successPOST,你在浏览器地址栏输入http://localhost:7001/helloWorld,结果因为没有登录,会重定向到登录页面,即login.html页面,当你登录成功之后,就会服务端跳转到/login/successPOST;或者你直接就在浏览器输入了登录页面地址,登录成功后也是来到/login/successPOST;
(2)
defaultSuccessUrl 有一个重载的方法,先说一个参数的 defaultSuccessUrl 方法,如果我们在 defaultSuccessUrl 中指定登录成功的跳转页面为/login/successGET,此时分两种情况,如果你是直接在浏览器中输入的登录地址,登录成功后,就直接跳转到/login/successGET,如果你是在浏览器中输入了其他地址,例如 http://localhost:7001/helloWorld,结果因为没有登录,又重定向到登录页面,此时登录成功后,就不会来到/login/successGET ,而是来到 /helloWorld页面; 
(3)
defaultSuccessUrl 还有一个重载的方法,第二个参数如果不设置默认为 false,也就是我们上面的的情况,如果手动设置第二个参数为 true,则 defaultSuccessUrl 的效果和successForwardUrl 一致;

注意事项:

    一般情况下defaultSuccessUrl 和 successForwardUrl只需配置一个即可,根据自己公司实际情况进行选择。

坑:           

   defaultSuccessUrl对应的接口需为GET、successForwardUrl对应的接口需为POST,如上LoginController #successGET和successPOST:

1.4、登录失败回调

1.4.1、概述

        前后端不分离的登录失败回调也有两个关键方法,即:failureForwardUrl 和 failureUrl。那么它们之间的区别是什么呢?       

failureForwardUrl登录失败之后会发生服务端跳转,failureUrl则是在登录失败之后,会发生重定向。

1.5、注销登录

1.5.1、概述

/**
 * 注销登录配置
 *     1、默认注销的 URL 是 /logout,是一个 GET 请求,我们可以通过 logoutUrl 方法来修改默认的注销 URL
 *     2、logoutRequestMatcher 方法不仅可以修改注销 URL,还可以修改请求方式,实际项目中,这个方法和 logoutUrl 任意设置一个即可
 *          .logoutRequestMatcher(new AntPathRequestMatcher("/logout","POST"))
 *     3、logoutSuccessUrl 表示注销成功后要跳转的页面
 *     4、deleteCookies 用来清除 cookie
 *     5、clearAuthentication 和 invalidateHttpSession 分别表示清除认证信息和使 HttpSession 失效,默认可以不用配置,默认就会清除
 */

1.5.2、配置

如上。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/320401.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

相对原子质量和质子数和原子数的关系。

问题描述: 相对原子质量和质子数和原子数的关系。 问题解答: 相对原子质量(相对原子质量单位,通常用amu表示)和质子数、原子数之间存在一定的关系。这关系可以通过以下公式表示: 其中,是相对…

Unity与Android交互通信系列(4)

上篇文章我们实现了模块化调用,运用了模块化设计思想和简化了调用流程,本篇文章讲述UnityPlayerActivity类的继承和使用。 在一些深度交互场合,比如Activity切换、程序启动预处理等,这时可能会需要继承Application和UnityPlayerAc…

分类问题:人工神经网络(ANN)+BP算法(误差后向传播)+考试例题讲解

学习链接:分类问题:人工神经网络(ANN)+BP算法(误差后向传播)+考试例题讲解 资料链接:链接:https://pan.baidu.com/s/1ijvMQmwtRgLO4KDSsNODMw 提取码:vyok 神经网络的应用非常的广,它核心思想非常简单,就是人是如何认知感知并且处理这个世界中的现实问题的。…

[学习笔记]刘知远团队大模型技术与交叉应用L2-Neural Network Basics

本节首先介绍神经网络的一些基本构成部分。然后简要介绍神经网络的训练方式。介绍一种基于神经网络的形成词汇的向量表示的方法。接下来继续介绍常见的神经网络结构:RNN和CNN。最后使用PyTorch演示一个NLP任务的一个完整训练的Pipeline。 神经网络的基本组成 单个…

620基于51单片机的密码锁设计[Proteus仿真]

620基于51单片机的密码锁设计[proteus仿真] 密码锁设计这个题目算是课 程设计和毕业设计中常见的题目了,本期是一个基于51单片机的密码锁设计 需要的源文件和程序的小伙伴可以关注公众号【阿目分享嵌入式】,赞赏任意文章 2¥,私信…

Vulnhub-DC1

前言 一个比较简单的实战靶场,官方要求是找到/root下的flag,所以直接提权即可。但对于学习和训练来说还是太简略了,在打靶场的时候还是全面一些较好。 本次靶场实战涉及信息收集、漏洞查找与利用、getshell、数据库渗透、密码破解、linux提…

c语言if条件语句

c语言if条件语句 c语言if条件语句 c语言if条件语句一、if条件格式二、if else条件格式三、if else if else条件格式 c语言支持最基本的三种程序运行结构:顺序结构、选择结构、循环结构 一、if条件格式 语句格式: if(表达式) {if条件执行语句 }#include&l…

乐意购项目前端开发 #1

一、创建vue项目 1. vue create 项目名 2. 运行项目 npm install npm run dev3.使用Git管理项目 创建远程仓库 leyigou 在项目文件终端执行以下代码 git init # git 初始化#这个要使用自己的仓库 git remote add origin gitgitee.com:xie-weijia/leyigou.git # 添加远程仓…

自定义白平衡调节的步骤 白平衡怎么设置好 白平衡和色温的关系 用什么软件调节白平衡

不管是拍摄视频/图片,还是视频/图片后期处理,白平衡调节都是很重要的环节,比如在氛围感很好咖啡厅内拍一张照,但是拍出来的人物脸色蜡黄,就是因为白平衡没设置好,下面就说说自定义白平衡调节的步骤&#xf…

Halcon滤波器 laplace 算子

Halcon滤波器 laplace 算子 使用laplace 算子对图像进行二次求导,会在边缘产生零点,因此该算子常常与zero_crossing算子配合使用。求出这些零点,也就得到了图像的边缘。同时,由于laplace算子对孤立像素的响应要比对边缘或线的响应…

学会编写自定义configure脚本,轻松实现定制化配置

学会编写自定义configure脚本,轻松实现定制化配置 一、configure脚本的作用和重要性二、configure脚本的基本结构和语法三、编写自定义configure脚本的步骤四、示例五、常见的问题总结 一、configure脚本的作用和重要性 configure脚本是用于自动配置软件源代码的脚…

瑞_Java开发手册_(二)异常日志

文章目录 异常日志的意义(一) 错误码(二) 异常处理(三) 日志规约附:错误码列表 🙊前言:本文章为瑞_系列专栏之《Java开发手册》的异常日志篇,本篇章主要介绍异常日志的错误码、异常处理、日志规约。由于博主是从阿里的《Java开发手…

[含完整代码]Linux使用.sh脚本自动部署(启动|停止|状态|日志)项目[超详细]

前言: 个人博客:www.wdcdbd.com 我们在linux部署.jar项目时,都需要通过java -jar的形式来部署,每次都要手动停止,部署,这样用起来会很麻烦。所以,这篇文章就是自己通过.sh脚本一键启动&#xf…

javacv和opencv对图文视频编辑-常见错误汇总

JavaCV 是一个使用 Java 语言实现的 OpenCV 和 FFmpeg 的接口库,它允许 Java 开发人员使用这些强大的多媒体处理库。然而,在使用 JavaCV 进行开发时,可能会遇到一些常见的错误。在本文中,我将介绍一些常见的 JavaCV 错误和解决方法…

Echarts可视化-数据请求-代码实现和思路

需求:为前端可视化图表提供数据支持。 实现: 时间戳获取优化(细化到秒) 根据时间获取数据(SQL编写) 前端需求数据返回(数据VO) 内容 Apache ECharts 营业额统计 用户统计 订单…

Flutter开发进阶之并发操作数据库

Flutter开发进阶之并发操作数据库 尽管 Flutter 本身不包含任何数据库功能,但可以使用各种第三方库和插件来在 Flutter 应用程序中实现数据库功能; 以下将使用sqflite作为例子,sqflite允许在 Flutter 应用程序中执行 SQL 查询,创…

(Java企业 / 公司项目)分布式事务Seata详解(含Seata+Nacos组合使用)(二)

一. Seata Server配置Nacos 什么是配置中心?配置中心可以说是一个"大货仓",内部放置着各种配置文件,你可以通过自己所需进行获取配置加载到对应的客户端.比如Seata Client端(TM,RM),Seata Server(TC),会去读取全局事务开关,事务会话存储模式等信息.Seata的配置中心…

ElasticSearch _update_by_query

根据查询条件进行数据更新 UPDATE job_call SET admin_id 0 WHERE admin_id 283; kibana.png 1.其中红色框的位置为query的内容,对应为SQL语句中的WHERE admin_id 283 2.划红色线的位置为修改内容,对应SQL中的SET admin_id 0。如果是更新多个字段s…

【2023 我的编程之旅】

前言 转眼 2024 年都过去 14 天了。回顾 2023 有太多技术上的思考以及人生的感悟,接下来趁着 CSDN 官方活动,顺便记录下来。 技术的价值 与现在的年轻人一心只想搞钱不同,刚毕业的时候,我的梦想是进入一家有实力的科技企业&…

Codeforces Bye 2023! - D - Mathematical Problem - 题解

目录 Mathematical Problem 题目大意: 思路解析: 代码实现: Mathematical Problem 题目大意: 第 31 中学的数学家们接到了以下任务: 给你一个多数 n ,你需要找出 n 个不同的数,它们都是整…