chapter14:springboot与安全

news2024/10/6 22:29:41

Spring Boot与安全视频

Spring Security, shiro等安全框架。主要功能是”认证“和”授权“,或者说是访问控制。

认证(Authentication)是建立在一个声明主体的过程(一个主体一般指用户,设备或一些可以在你的应用程序中执行动作的其他系统)。

授权(Authorization)指确定一个主体是否允许在你的应用程序执行一个动作的过程。 为了抵达需要授权的店, 主体的身份已经有认证过程建立。

这里我们使用Spring Security练习。

1. pom.xml

创建springboot应用,导入spring-boot-starter-security等相关依赖。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>1.5.12.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>

    <groupId>com.crysw.security</groupId>
    <artifactId>springboot05-security</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>springboot05-security</name>
    <description>springboot05-security</description>

    <properties>
        <java.version>1.8</java.version>
        <!--指定thymeleaf相关依赖的版本-->
        <thymeleaf.version>3.0.9.RELEASE</thymeleaf.version>
        <thymeleaf-layout-dialect.version>2.3.0</thymeleaf-layout-dialect.version>
        <thymeleaf-extras-springsecurity4.version>3.0.2.RELEASE</thymeleaf-extras-springsecurity4.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

        <!--可以在html中引用thymeleaf来获取授权和认证的相关信息-->
        <dependency>
            <groupId>org.thymeleaf.extras</groupId>
            <artifactId>thymeleaf-extras-springsecurity4</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>

    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>

</project>

2. html页面

准备静态资源(html测试页面)
在这里插入图片描述

2.1 welcome.html

/请求转发到首页welcome.html

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org"
      xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity4">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:align="center">欢迎光临武林秘籍管理系统</h1>
    <!--没有认证-->
<div sec:authorize="!isAuthenticated()">
    <!--/login的get请求是security默认跳转登录页面的处理-->
    <!--<h2 align="center">游客您好,如果想查看武林秘籍,<a th:href="@{/login}">请登录</a></h2>-->
    <!--/userlogin的get请求是自定义跳转自己登录认证页面的处理-->
    <h2 th:align="center">游客您好,如果想查看武林秘籍,<a th:href="@{/userlogin}">请登录</a></h2>
</div>
 <!--只有登录认证了才展示注销按钮-->
<div sec:authorize="isAuthenticated()">
    <h2><span sec:authentication="name"></span>, 您好,您的角色有:<span
            sec:authentication="principal.authorities"></span></h2>
    <form th:action="@{/logout}" method="post">
        <input type="submit" value="注销"/>
    </form>
</div>

<hr>
<!--授权VIP1的模块展示-->
<div sec:authorize="hasRole('VIP1')">
    <h3>普通武林秘籍</h3>
    <ul>
        <li><a th:href="@{/level1/1}">罗汉拳</a></li>
        <li><a th:href="@{/level1/2}">武当长拳</a></li>
        <li><a th:href="@{/level1/3}">全真剑法</a></li>
    </ul>
</div>
<!--授权VIP2的模块展示-->
<div sec:authorize="hasRole('VIP2')">
    <h3>高级武林秘籍</h3>
    <ul>
        <li><a th:href="@{/level2/1}">太极拳</a></li>
        <li><a th:href="@{/level2/2}">七伤拳</a></li>
        <li><a th:href="@{/level2/3}">梯云纵</a></li>
    </ul>
</div>

<!--授权VIP3的模块展示-->
<div sec:authorize="hasRole('VIP3')">
    <h3>绝世武林秘籍</h3>
    <ul>
        <li><a th:href="@{/level3/1}">葵花宝典</a></li>
        <li><a th:href="@{/level3/2}">龟派气功</a></li>
        <li><a th:href="@{/level3/3}">独孤九剑</a></li>
    </ul>
</div>

</body>
</html>

2.2 login.html

请求/userlogin转发到自定义的登录页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h1 th:align="center">欢迎来到武林秘籍管理系统</h1>
<hr/>
<div th:align="center">
    <!--默认post形式的/login代表处理登录提交-->
    <!--如果定制loginPage,那么loginPage的post请求就是登录提交-->
    <form th:action="@{/userlogin}" method="post">
        用户名: <input type="text" name="uname"/>
        <br/>
        密码:<input type="password" name="pwd"/>
        <br/>
        <input type="checkbox" name="remember" id=""/> remember me
        <br/>
        <input type="submit" value="登录"/>
    </form>
</div>
</body>
</html>

2.3 level1模块页面

<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
    <meta http-equiv="Content-Type" content="text/html" charset="UTF-8">
    <title>Title</title>
</head>
<body>
<a th:href="@{/}">返回</a>
<h1>罗汉拳</h1>
<p>罗汉拳站当秧,打起来不要慌</p>
</body>
</html>

其他模块页面一样,简单改一下内容即可。

3. security配置类

WebSecurityConfigurerAdapter为创建WebSecurityConfigurer实例提供了一个方便的基类。允许通过重写方法进行定制实现,自定义授权规则和认证规则。

@EnableWebSecurity
public class MySecurityConfig extends WebSecurityConfigurerAdapter {

    /**
     * 定制请求的授权规则
     *
     * @param http the {@link HttpSecurity} to modify
     * @throws Exception
     */
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests().antMatchers("/").permitAll()
                // VIP1角色的用户才能访问level1的页面,其他同理
                .antMatchers("/level1/**").hasRole("VIP1")
                .antMatchers("/level2/**").hasRole("VIP2")
                .antMatchers("/level3/**").hasRole("VIP3");

        // 开启自动配置的登录功能
//        http.formLogin();
        http.formLogin().usernameParameter("uname").passwordParameter("pwd")
                .loginPage("/userlogin").loginProcessingUrl("/userlogin");
        // 1. 如果没有访问权限,转发到/login请求来到登录页;
        // 2. 重定向到/login?error表示登录失败。 更多详细规定
        // 3. 默认post形式的/login代表处理登录提交
        // 4.如果定制loginPage,那么loginPage的post请求就是登录提交

        // 开启自动配置的注销功能, 访问/logout表示用户注销,清空session; 注销成功后来到首页;
        http.logout().logoutSuccessUrl("/");
        // 开启记住我的功能, 将cookie发给浏览器保存,以后登录带上这个cookie,只要通过服务器端的验证就可以免登录
        // 如果点击”注销“,也会删除这个cookie
//        http.rememberMe();
        http.rememberMe().rememberMeParameter("remember");
    }

    /**
     * 定制认证规则
     *
     * @param auth the {@link AuthenticationManagerBuilder} to use
     * @throws Exception
     */
    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("zhangsan").password("123456").roles("VIP1", "VIP2")
                .and().withUser("lisi").password("123456").roles("VIP2", "VIP3")
                .and().withUser("wangwu").password("123456").roles("VIP1", "VIP3");
    }
}

启动应用后,访问主页,需要先登录认证。可以看到张三有访问VIP1, VIP2权限的区域展示。
在这里插入图片描述

登录认证成功后,跳转到欢迎主页。在这里插入图片描述

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

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

相关文章

【ARM64 ATF 系列 3 -- ARM64 warm reset 与 cold reset】

文章目录 ARM64 Reset1.1.1 reset 运行级别1.1.2 warm reset 寄存器1.1.3 PSCI Suspend/Resume ARM64 Reset ARMv8-A支持两种复位&#xff0c;冷复位和热复位。两者主要区别是冷复位会将debug 功能模块也一同复位&#xff0c;热复位在默认情况则不会复位 debug 功 能模块。 处理…

手机便签中可以打勾的圆圈或小方块怎么弄?

在日常的生活和工作中&#xff0c;很多网友除了使用手机便签来记录灵感想法、读书笔记、各种琐事、工作事项外&#xff0c;还会用它来记录一些清单&#xff0c;例如待办事项清单、读书清单、购物清单、旅行必备物品清单等。 在按照记录的清单内容来执行的时候&#xff0c;为了…

创建好的VMware虚拟机如何连接上外网?MobaX和XShell如何连接虚拟机

配置虚拟机网卡 首先点击VMware菜单栏&#xff0c;编辑-虚拟网络编辑器-更改设置 选择VMnet8-NAT设置&#xff0c;并记住子网IP之后有用 记住网关IP 修改实际创建的虚拟机网卡 修改设置&#xff0c;vi /etc/sysconfig/network-scripts/ifcfg-ens32 修改前&#xff1a; 修…

预测地震引发的洪水

当断层陡坡像水坝一样发挥作用时&#xff0c;地表破裂地震可能会突然改变河流的路线。研究人员现已成功模拟发生在新西兰的此类事件。 当断层位移突然改变地貌时&#xff0c;地表破裂地震可能会改变河流的路线&#xff0c;例如新西兰的怀奥托阿/克拉伦斯河&#xff0c;如图所示…

SpringBoot 的自动装配特性

1. Spring Boot 的自动装配特性 Spring Boot 的自动装配&#xff08;Auto-Configuration&#xff09;是一种特性&#xff0c;它允许您在应用程序中使用默认配置来自动配置 Spring Framework 的各种功能和组件&#xff0c;从而减少了繁琐的配置工作。通过自动装配&#xff0c;您…

算法40:移动零

一、需求 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12] 输出: [1,3,12,0,0]示例 2: 输入: nums …

opencv 基础54-利用形状场景算法比较轮廓-cv2.createShapeContextDistanceExtractor()

注意&#xff1a;新版本的opencv 4 已经没有这个函数 cv2.createShapeContextDistanceExtractor() 形状场景算法是一种用于比较轮廓或形状的方法。这种算法通常用于计算两个形状之间的相似性或差异性&#xff0c;以及找到最佳的匹配方式。 下面是一种基本的比较轮廓的流程&…

B2B2C多商户电子商务网站开发--海外商城系统搭建

一、明确目标与需求 在开始搭建海外商城系统之前&#xff0c;企业需要明确自己的目标和需求。例如&#xff0c;要面向哪些国家和地区、主要销售哪些产品、需要提供哪些语言和货币支持等。这些目标和需求将有助于企业制定合理的开发计划和方案。 二、选择合适的开发平台和工具…

【安装部署】Mysql下载及其安装的详细步骤

1.下载压缩包 官网地址&#xff1a;www.mysql.com 2.环境配置 1.先解压压缩包 2.配置环境变量 添加环境变量&#xff1a;我的电脑--->属性-->高级-->环境变量-->系统变量-->path 3.在mysql安装目录下新建my.ini文件并&#xff0c;编辑my.ini文件 编辑内容如…

Linux常规操作命令

日升时奋斗&#xff0c;日落时自省 目录 1、vim 1.1、工作模式 1.2、末行模式操作相关命令 1.2.1、保存退出操作 1.2.2、查找替换 1.3、输入模式操作相关命令 1.3.1、移动相关命令 1.3.2、删除和剪切命令 1.3.3、复制操作 1.3.4、撤销 2、head 3、tail 4、ps 5、…

HTTP代理与HTTPS代理请求的方式揭秘

今天&#xff0c;我们要一起来揭秘HTTP代理与HTTPS代理请求的方式&#xff0c;帮助大家更好地理解和使用这两种代理。我们将分析它们的不同之处&#xff0c;并提供一些实际的例子和操作经验&#xff0c;让你轻松玩转网络请求&#xff01; HTTP代理请求方式&#xff1a; HTTP代…

IBM Spectrum LSF 分布式系统(作业调度系统),提高高性能计算(HPC)的价值

IBM Spectrum LSF Suites 凭借更快的处理和更轻松的处理&#xff0c;提高高性能计算的价值 要点 通过隐藏工作负载密集型计算环境的复杂性&#xff0c;提高用户生产效率简化计算集群管理并划分工作负载优先级&#xff0c;以快速满足竞争激烈的行业瞬息万变的需求通过优化系统…

LLM - CUDA out of memory. 到底怎么事

目录 一.引言 二.报错日志 1.日志数据 2.日志提示 ◆ max_split_size_mb ◆ See documentation ◆ 更多解决方案 三.日志扩展 1.Reserved Memory 是什么&#xff1f; 2.Tired to allocate 小于 free MiB 就会报 OOM 嘛? 3.already allocated 是当前任务占用内存&a…

【高危】 Microsoft Teams 远程代码执行漏洞

漏洞描述 Microsoft Teams 是微软推出的一款团队协作平台&#xff0c;提供了聊天、通话、在线会议、文件共享等功能。 Microsoft Teams 受影响版本中&#xff0c;当用户加入攻击者设置的恶意 Microsoft Teams 会议时&#xff0c;攻击者可远程执行任意代码。 漏洞名称Microso…

游戏类APP的如何设置广告场景最大化用户价值?提升变现收益?

最近几年&#xff0c;游戏类市场的不断增长激发了广告主预算的不断投入&#xff0c;越来越多的游戏类APP通过广告变现的方式增收&#xff0c;并且获得持续上涨的eCPM。 具有潜力的游戏品类参考 根据游戏品类的增长数据和广告收益规模&#xff0c;休闲/模拟/街机均为收益正向的…

Echarts 让饼图中间文字居中并自适应图表

背景&#xff1a; 产品提出需求在饼图中间放两行文字且居中 “简单&#xff0c;劈劈啪啪写完了” 产品再提出你这个没有自适应啊&#xff0c;屏幕放大、缩小你这个就没有居中了&#xff0c;甚至会和饼图重叠 “emmmmm…" UI图如下&#xff1a; 方案一&#xff1a;使用ti…

数据结构和算法——哈希查找冲突处理方法(开放地址法-线性探测、平方探测、双散列探测、再散列,分离链接法)

目录 开放地址法&#xff08;Open Addressing&#xff09; 线性探测&#xff08;Linear Probing&#xff09; 散列表查找性能分析 平方探测&#xff08;Quadratic Probing&#xff09; 定理 平方探测法的查找与插入 双散列探测法&#xff08;Double Hashing&#xff09…

【C语言】经典题目(四)

HI&#xff0c;大家好~&#x1f61d;&#x1f61d;这是一篇C语言经典题目的博客。 更多C语言经典题目及刷题篇&#xff0c;可以参考&#xff1a; &#x1f338; 【C语言】经典题目(一) &#x1f338; 【C语言】经典题目(二) &#x1f338; 【C语言】经典题目(三) &#x1f338;…

生信分析pandas数据处理 Python简明教程 | 视频17

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

ant design pro 中ModalForm的参数open无法控制的问题

根据antd自己的说明&#xff0c;visible这个参数在下个版本会被替换成open&#xff0c;所以今天我试着用open。 但是用了open之后发现这个model弹不出来&#xff0c;用visible是正常的。 那么问题在哪呢&#xff1f;又是在import的位置不对 open可以使用的是&#xff1a; imp…