Springboot +spring security,认证方式---Form表单认证的实现(二)

news2024/11/26 20:24:06

一.简介

这篇文章来学习下security的认证方式其中的Form表单认证

二.Spring Security的认证方式

2.1什么是认证

认证:
就是用来判断系统中是否存在某用户,并判断该用户的身份是否合法的过程,解决的其实是用户登录的问题。认证的存在,是为了保护系统中的隐私数据与资源,只有合法的用户才可以访问系统中的资源。

2.2认证的方式

在Spring Security中,常见的认证方式可以分为HTTP层面和表单层面,常见的认证方式如下:

  1. HTTP基本认证;
  2. Form表单认证
  3. HTTP摘要认证;

这篇文章先讲HTTP基本认证

三. Form表单认证

3.1Form表单认证简介

对于表单认证,其实在SpringBoot开发环境中,只要添加了Spring Security的依赖包,就会自动实现表单认证。先看下源码,在WebSecurityConfigurerAdapter类的config(HttpSecurity http)方法中,可以看到如下实现,截图如下:
在这里插入图片描述
所以在SpringBoot环境中,默认支持的就是表单认证方式。

3.2表单认证效果

我们在访问某个Web接口之前,都会重定向到一个Security自带的login登录页面上,这个登录页面,就是表单认证的效果。截图如下:
在这里插入图片描述

3.3表单认证中的预置url和页面

为什么表单认证会有以上效果?这是因为在默认的formLogin配置中,自动配置了一些url和页面:

  1. /login(get): get请求时会跳转到这个页面,只要我们访问任意一个需要认证的请求时,都会跳转到这个登录界面。
  2. /login(post): post请求时会触发这个接口,在登录页面点击登录时,默认的登录页面表单中的action就是关联这个login接口。
  3. /login?error: 当用户名或密码错误时,会跳转到该页面。
  4. /: 登录成功后,默认跳转到该页面,如果配置了index.html页面,则 ”/“ 会重定向到index.html页面,当然这个页面要由我们自己实现。
  5. /logout: 注销页面。
  6. /login?logout: 注销成功后跳转到的页面。

由此可见,SpringSecurity默认有两个login,即登录页面和登录接口的地址都是 /login:

  1. GET http://localhost:8080/login
  2. POST http://localhost:8080/login

如果是 GET 请求,表示你想访问登录页面;如果是 POST 请求,表示你想提交登录数据。

四. 创建SpringSecurity项目

参考之前的文章,这边不做叙述。

五.代码实现

5.1创建SecurityConfig配置类

创建SecurityConfig类,继承自WebSecurityConfigurerAdapter父类,该类的作用如下:

  1. 验证所有请求;
  2. 允许用户使用表达登录进行身份验证;
  3. 允许用户使用Http基本认证。

代码如下:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //super.configure(http);
 
        //配置表单认证方式
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                //开启表单认证
                .formLogin();
    }
}

我们在SecurityConfig类上添加@EnableWebSecurity注解后,会自动被Spring发现并注册。在configure()方法中,我执行了formLogin()方法,该方法的功能就是开启表单认证。

5.2创建web接口

HelloController类的代码如下:


import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
public class HelloController {
 
    @GetMapping("/hello")
    public String hello() {
        return "德玛西亚";
    }
 
}

5.3yml配置文件

创建一个application.yml配置文件,配置如下:

spring:
  security:
    user:
      name: demaxiya
      password: 123

六.功能验证

6.1启动项目

接下来启动项目,访问我们定义的/hello接口时,首先会重定向到/login页面,截图如下:
在这里插入图片描述

我们只有输入自己配置的用户名和密码后,才可以正常访问/hello接口。

七.自定义表单认证的登录界面

7.1服务端代码定义

如果想实现自定义登录页面,可以在上面定义的SecurityConfig 类中,复写configure(WebSecurity web) 和 configure(HttpSecurity http) 方法,通过loginPage()方法来配置自定义登录页面,代码如下:

import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;

@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
 
    /**
     * 用来定义哪些请求需要忽略安全控制,哪些请求必须接受安全控制;还可以在合适的时候清除SecurityContext以避免内存泄漏,
     * 同时也可以用来定义请求防火墙和请求拒绝处理器,另外我们开启Spring Security Debug模式也是这里配置的
     */
    @Override
    public void configure(WebSecurity web) throws Exception {
        //super.configure(web);
        web.ignoring()
                .antMatchers("/js/**", "/css/**", "/images/**");
    }
 
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        //super.configure(http);
 
        //2.配置自定义的登录页面
        http.authorizeRequests()
                .anyRequest()
                .authenticated()
                .and()
                .formLogin()
            	//加载自定义的登录页面地址
                .loginPage("/myLogin.html")
                .permitAll()
                .and()
                //注意:需禁用crsf防护功能,否则登录不成功
                .csrf()
                .disable();
    }
 
}

以上这段代码,就是实现自定义登录页面的核心代码了。

你会发现实现自定义表单认证的代码很简单,但是Spring Security内部是如何加载我们自定义的登录页面的呢?有哪些类或方法来负责完成呢?如果想要弄明白这个原理,我们需要先了解2个核心参数:WebSecurity和HttpSecurity,接下来我带各位分别了解一下这2个核心参数。

7.1.1

WebSecurity执行流程,截图如下:
在这里插入图片描述
这是我们请求时,WebSecurity的执行流程图。

在configure(WebSecurity web)方法中,有个核心参数:WebSecurity类!在这个类里定义了一个securityFilterChainBuilders集合,可以同时管理多个SecurityFilterChain过滤器链,各位可以回顾我们学习Web基础时,关于过滤器的知识点,这些过滤器的执行是不是比Servlet更早?

当WebSecurity在执行时,会构建出一个名为 ”springSecurityFilterChain“ 的 Spring BeanFilterChainProxy代理类,它的作用是来 定义哪些请求可以忽略安全控制,哪些请求必须接受安全控制;以及在合适的时候 清除SecurityContext 以避免内存泄漏,同时也可以用来 定义请求防火墙和请求拒绝处理器,也可以在这里 开启Spring Security 的Debug模式。

因为有上面这一系列的Filter过滤器,我们就可以利用web.ignoring() 方法来配置想要忽略的静态资源 URL 地址,这样这些静态资源就可以不被拦截,从而可以被识别访问了。

7.1.2HttpSecurity作用

HttpSecurity的作用,截图如下:在这里插入图片描述
HttpSecurity用来构建包含一系列的过滤器链SecurityFilterChain,平常我们的配置就是围绕着这个SecurityFilterChain进行。

7.2页面定义

html核心代码如下:

<body>
    <div class="login">
        <h2>Access Form</h2>
        <div class="login-top">
            <h1>登录验证</h1>
            <form action="/myLogin.html" method="post">
                <input type="text" name="username" placeholder="username" />
                <input type="password" name="password" placeholder="password" />
                <div class="forgot">
                    <a href="#">忘记密码</a>
                    <input type="submit" value="登录" >
                </div>
            </form>
        </div>
        <div class="login-bottom">
            <h3>新用户&nbsp;<a href="#">注&nbsp;册</a></h3>
        </div>
    </div>
</body>

注意:

form表单中action的值,暂时先写成”/myLogin.html“。

7.3页面定义

启动项目后,我们访问接口时,就会自动跳转到自己定义的/myLogin.html页面上,输入用户名和密码后,就可以成功访问自己的接口。截图如下:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Java-10】深入浅出线程安全、死锁、状态、通讯、线程池

主要内容 线程安全线程死锁线程的状态线程间通讯线程池 1 线程安全 1.1 线程安全产生的原因 多个线程在对共享数据进行读改写的时候&#xff0c;可能导致的数据错乱就是线程的安全问题了 问题出现的原因 : 多个线程在对共享数据进行读改写的时候&#xff0c;可能导致的数据…

有哪些辅助计算机开发的工具推荐?

以下是一些辅助计算机开发的工具推荐&#xff1a; 集成开发环境&#xff08;Integrated Development Environment&#xff0c;IDE&#xff09;&#xff1a; 常用的IDE包括Visual Studio、Eclipse、IntelliJ IDEA、PyCharm等&#xff0c;它们提供了代码编辑器、调试器、构建工…

TDengine 集成 EMQX 通过规则引擎实现设备数据直接入库

背景 曾使用过 IoTDB 自带的 MQTT Broker 实现了设备数据入库&#xff0c;那么使用 TDengine 时&#xff0c;我们可以借助 EMQX &#xff08;一款优秀的国产开源 MQTT Broker &#xff09;的规则引擎结合 TDengine 的 RESTful API 完成设备数据的路由与入库。 用到的工具 TD…

chatgpt赋能python:Python下载Module的指南

Python下载Module的指南 作为一门高级编程语言&#xff0c;Python凭借其简单易学、高效便捷的特点&#xff0c;越来越受到广大程序员的喜爱。Python社区也逐渐发展壮大&#xff0c;丰富的第三方Module为我们提供了更多功能强大、用途广泛的工具。本篇文章将介绍Python下载Modu…

从汇编代码的角度去理解C++多线程编程问题

目录 1、多线程问题实例 2、理解该多线程问题的预备知识 2.1、二进制机器码和汇编代码 2.2、多线程切换与CPU时间片 2.3、多线程创建与线程函数 3、从汇编代码的角度去理解多线程问题 4、问题解决办法 5、熟悉汇编代码有哪些用处&#xff1f; 5.1、在代码中插入汇编代…

信号处理与分析-傅里叶

目录 一、引言 二、傅里叶级数 1. 傅里叶级数的定义 2. 傅里叶级数的性质 三、傅里叶变换 1. 傅里叶变换的定义 2. 傅里叶变换的性质 四、离散傅里叶变换 1. 离散傅里叶变换的定义 2. 离散傅里叶变换的性质 五、应用实例 1. 信号处理 2. 图像处理 六、总结 一、引…

Revit中窗族的默认窗台高度与底高度是一样?

​  一、窗族的默认窗台高度与底高度是一样的吗? 窗族的系统设定中有一个自带的参数就是默认窗台高度&#xff0c;指的是窗户放置的时候窗户最底端离墙的最底端高度。 当我们创建一个建筑样板将我们创建好的窗族放置好的时候&#xff0c;这个参数就在窗的类型属性中&#xf…

2023年上半年 软件设计师答案解析

前言&#xff1a;2023年上半年软考已经落幕了&#xff0c;学长整理了一下软件设计师的题目以及个人理解的答案&#xff08;仅供参考&#xff09;希望能够帮助参加软考的各个小伙伴能够清晰的估分&#xff0c;希望大家都能通过考试~ 目录 2023年上半年 软件设计师 上午试卷 2023…

C Primer Plus第十二章编程练习答案

学完C语言之后&#xff0c;我就去阅读《C Primer Plus》这本经典的C语言书籍&#xff0c;对每一章的编程练习题都做了相关的解答&#xff0c;仅仅代表着我个人的解答思路&#xff0c;如有错误&#xff0c;请各位大佬帮忙点出&#xff01; 1.不使用全局变量&#xff0c;重写程序…

网络连接中的舔狗协议

舔狗网络协议 &#xff08;discard protocol) 最近互联网上&#xff0c;“舔狗” 这个词语很火&#xff0c;也衍生出来很多梗&#xff08;快速说出互联网 4 大舔狗&#xff01;&#xff01;&#xff01;&#xff09;。然后今天偶然间看到了一个 RFC 文档&#xff0c; 发现了一…

用户需求分析工具:Y模型

用户需求分析工具&#xff1a;Y模型 《人人都是产品经理》作者苏杰提出 阿里巴巴产品经理多年 趣讲大白话&#xff1a;有个框框好同频 【趣讲信息科技180期】 **************************** 很多交流就是鸡同鸭讲 沟通的背景、动机、目的、方式、高度等严重不同 如果有一个模型…

服务器端安装jupyter notebook并在本地使用与环境配置一条龙服务【服务器上跑ipynb】

linux服务器端安装jupyter notebook并在本地使用 1.生成配置文件:2.配置Jupyter notebook密码3,修改配置文件~/.jupyter/jupyter_notebook_config.py4. 本地访问远端的服务器的jupyter1.首先在Linux服务器上启动Jupyter notebook2.然后在本地转发端口 为jupyter notebook配置co…

【云原生|探索 Kubernetes 系列 6】从 0 到 1,轻松搭建完整的 Kubernetes 集群

前言 大家好&#xff0c;我是秋意零。 前面一篇中&#xff0c;我们介绍了 kubeadm 的工作流程。那么今天我们就实际操作一下&#xff0c;探索如何快速、高效地从 0 开始搭建一个完整的 Kubernetes 集群&#xff0c;让你轻松驾驭容器化技术的力量&#xff01;&#xff01; &am…

json和pickle模块

目录 ❤ json和pickle模块 序列化 json pickle python从小白到总裁完整教程目录:https://blog.csdn.net/weixin_67859959/article/details/129328397?spm1001.2014.3001.5502 ❤ json和pickle模块 序列化 把对象(变量)从内存中变成可存储或传输的过程称之为序列化&am…

3D EXPERIENCE“热知识” | 如何使用3D EXPERIENCE平台上的问题管理?

3D EXPERIENCE 平台上的问题管理对任何组织都是有用的工具&#xff0c;无论其规模大小。无论是使用它来标记和分发PDF还是在车间和工程部门之间分享想法&#xff0c;问题管理都可以简化日常活动。简而言之&#xff0c;它会根据权限列出现有问题&#xff0c;并让用户创建新问题&…

软件测试----软件测试四大测试过程

1、测试分析 &#xff08;1&#xff09;要点 1&#xff09;软件需求分析 2&#xff09;测试需求项的提取 3&#xff09;用户使用场景分析 4&#xff09;测试工具的调研和选取 5&#xff09;测试缺陷分析 &#xff08;2&#xff09;分工 1&#xff09;测试人员&#xff1a;提…

09:mysql---事务

目录 1:事务简介 2:事务操作 3:事务四大特性 4:并发事务问题 5:事务隔离级别 1:事务简介 事务 是一组操作的集合&#xff0c;它是一个不可分割的工作单位&#xff0c;事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求&#xff0c;即这些操作要么同时成功&…

周赛347(模拟、思维题、动态规划+优化)

文章目录 周赛347[2710. 移除字符串中的尾随零](https://leetcode.cn/problems/remove-trailing-zeros-from-a-string/)模拟 [2711. 对角线上不同值的数量差](https://leetcode.cn/problems/difference-of-number-of-distinct-values-on-diagonals/)模拟 [2712. 使所有字符相等…

索引下推(Index Condition Pushdown)

使用一张用户表t_user&#xff0c;表里创建联合索引&#xff08;name, age&#xff09;。 如果现在有一个需求&#xff1a;检索出表中名字第一个字是张&#xff0c;而且年龄是10岁的所有用户。那么&#xff0c;SQL语句是这么写的&#xff1a; 复制代码 select * from tuser w…

【教学类-35-01】带笔画步骤图的描字(姓氏)(A4整张)

作品展示&#xff1a; 1、图片一行&#xff08;0-6&#xff09;&#xff1a;文字简单&#xff0c;写3*412个字 2、图片2行&#xff08;6-12&#xff09;&#xff1a;笔画适中&#xff0c;写3*39个字 3、图片3行&#xff08;12-18&#xff09;&#xff1a;笔画适中&#xff0c;…