当前位置: 首页 > news >正文

Spring Security授权管理

授权是Spring Security的核心功能之一,是根据用户的权限来控制用户访问资源的过程,拥有资源的访问权限则可正常访问,没有访问的权限时则会被拒绝访问。认证是为了保证用户身份的合法性,而授权则是为了更细粒度地对隐私数据进行划分,授权是在认证通过后发生的,以控制不同的用户访问不同的资源。Spring Security提供了授权方法,开发者通过这些方法进行用户访问控制.

Spring Security授权流程

实现授权需要对用户的访问进行拦截校验,校验用户的权限是否可以操作指定的资源。Spring Security使用标准Filter建立了对Web请求的拦截,最终实现对资源的授权访问。

①拦截请求。已认证用户访问受保护的Web资源将被SecurityFilterChain中FilterSecurityInterceptor实例对象拦截。

②获取资源访问策略。FilterSecurityInterceptor实例对象会通过SecurityMetadataSource的子类DefaultFilterInvocationSecurityMetadataSource实例对象中获取要访问当前资源所需要的权限,权限封装在Collection实例对象中。 SecurityMetadataSource是读取访问策略的抽象,具体读取的内容,就是开发者配置的访问规则。

③FilterSecurityInterceptor通过AccessDecisionManager进行授权决策,若决策通过,则允许访问资 源,否则将禁止访问。AccessDecisionManager中包含一系列AccessDecisionVoter,可对当前认证过的身份是否有权访问对应的资源进行投票,AccessDecisionManager根据投票结果做出最终决策。

Spring Security自定义授权

根据授权的位置和形式,通常可以将授权的方式分为Web授权和方法授权,这两种授权方式都会调用AccessDecisionManager进行授权决策。下面分别对这两种自定义授权的方式进行讲解。

1.Web授权

Spring Security的底层实现本质是通过多个Filter形成的过滤器链完成,过滤器链中提供了默认的安全拦截机制,设置安全拦截规则,以控制用户的访问。HttpSecurity是SecurityBuilder接口的实现类,是HTTP安全相关的构建器,Spring Security中可以通过HttpSecurity对象设置安全拦截规则,并通过该对象构建过滤器链。

HttpSecurity可以根据不同的业务场景,对不同的URL采用不同的权限处理策略。当开发者需要配置项目的安全拦截规则时,可以调用HttpSecurity对象对应的方法实现。

HttpSecurity类的常用方法

方法

作用

authorizeRequests()

开启基于HttpServletRequest请求访问的限制

formLogin()

开启基于表单的用户登录

httpBasic()

开启基于HTTP请求的Basic认证登录

logout()

开启退出登录的支持

sessionManagement()

开启Session管理配置

rememberMe()

开启记住我功能

csrf()

配置CSRF跨站请求伪造防护功能

通过authorizeRequests()方法可以添加用户请求控制的规则,这些规则通过用户请求控制的相关方法指定。 

用户请求控制的常用方法

方法

作用

antMatchers(String... antPatterns)

开启Ant风格的路径匹配

mvcMatchers(String... patterns)

开启MVC风格的路径匹配,与Ant风格类似

regexMatchers(String... regexPatterns)

开启正则表达式的路径匹配

and()

功能连接符

anyRequest()

匹配任何请求

rememberMe()

开启记住我功能

access(String attribute)

使用基于SpEL表达式的角色进行匹配

方法

作用

hasAnyRole(String... roles)

匹配用户是否有参数中的任意角色

hasRole(String role)

匹配用户是否有某一个角色

hasAnyAuthority(String... authorities)

匹配用户是否有参数中的任意权限

hasAuthority(String authority)

匹配用户是否有某一个权限

authenticated()

匹配已经登录认证的用户

fullyAuthenticated()

匹配完整登录认证的用户(非rememberMe登录用户)

hasIpAddress(String ipaddressExpression)

匹配某IP地址的访问请求

permitAll()

无条件对请求进行放行

通过HttpSecurity类的formLogin()方法开启基于表单的用户登录后,可以指定表单认证的相关设置。

基于表单的身份验证的常见方法

方法

作用

loginPage(String loginPage)

指定自定义登录界面,不使用SpringSecurity默认登录界面

loginProcessingUrl(String loginProcessingUrl)

指定处理登录的请求url,为表单提交用户信息的Action

successForwardUrl(String forwardUrl) 

指定登录成功后默认跳转的路径

下面通过案例演示在Spring Boot项目中使用Spring Security的Web授权方式进行权限管理。

(1)导入登录页面

在项目的resources目录的templates文件夹中导入自定义的登录页面login.html。

<html lang="en" xmlns:th="http://www.thymeleaf.org"><head><title>图书管理系统</title><link rel="stylesheet" type="text/css" th:href="@{/css/webbase.css}"><link rel="stylesheet" type="text/css" th:href="@{/css/pages-login-manage.css}"></head><body><div class="loginmanage"><div class="py-container"><h4 class="manage-title">图书管理系统</h4><div class="loginform"><ul class="sui-nav nav-tabs tab-wraped"><li class="active"><h3>账户登录</h3></li></ul><div class="tab-content tab-wraped"><div id="profile" class="tab-pane active"><form id="loginform" class="sui-form" th:action="@{/doLogin}" method="post"><div class="input-prepend"><span class="add-on loginname">用户名</span><input type="text" placeholder="用户名" class="span2 input-xfat" name="username"></div><div class="input-prepend"><span class="add-on loginpwd">密码</span><input type="password" placeholder="请输入密码" class="span2 input-xfat" name="password"></div><div class="logined"><a class="sui-btn btn-block btn-xlarge btn-danger"href='javascript:document:loginform.submit();' target="_self">登&nbsp;&nbsp;录</a></div></form></div></div></div></div></div></body></html>

(2)编辑配置类

在项目的WebSecurityConfig配置类中使用HttpSecurity对象设置安全拦截规则,并创建SecurityFilterChain对象交由Spring管理

@Configuration
public  class  WebSecurityConfig {
@Bean
public  PasswordEncoder passwordEncoder() {
return  new  BCryptPasswordEncoder();
}
@Bean
public  SecurityFilterChain securityFilterChain(HttpSecurity http) throws  Exception{
http.authorizeRequests() // 定义哪些URL需要被保护、哪些不需要被保护
.mvcMatchers("/loginview","/css/**","/img/**").permitAll()
.mvcMatchers("/book/admin/**").hasRole("ADMIN")
.anyRequest().authenticated() // 任何请求,登录后可以访问
.and()
.formLogin()
.loginPage("/loginview")
.loginProcessingUrl("/doLogin")
.and()
.csrf().disable()//禁止csrf 跨站请求保护;
.headers().frameOptions().sameOrigin();
return  http.build();
}
}

在WebMvcConfig配置类中添加loginview的视图映射

@Configuration
public  class  WebMvcConfig implements  WebMvcConfigurer {
@Override
public  void  addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/").setViewName("main");
registry.addViewController("/loginview").setViewName("login");
}
}

(3)测试效果

启动项目,在浏览器中通过“http://localhost:8080/”访问项目首页。

在登录页面使用zhangsan的用户信息进行登录。

图书管理需要角色为ROLE_ADMIN的用户才可以访问,用户zhangsan的角色为ROLE_COMMON,在后台首页单击“图书管理”链接。

使用用户lisi进行登录,lisi对应的角色为ROLE_ADMIN,登录成功再次访问“图书管理”。

2.方法授权

Spring Security除了可以在配置类中通过创建过滤器链设置安全拦截规则外,还可以使用@Secured、@RolesAllowed和@PreAuthorize注解控制类中所有方法或者单独某个方法的访问权限,以实现对访问进行授权管理。

使用@Secured和@RolesAllowed注解时,只需在注解中指定访问当前注解标注的类或方法所需要具有的角色,允许多个角色访问时,使用大括号对角色信息进行包裹,角色信息之间使用分号分隔即可。

@RequestMapping("list")
@Secured({"ROLE_ADMIN","ROLE_COMMON"})
public String findList() {return "book_list";
}
@RequestMapping("admin/manag")
@RolesAllowed("ROLE_ADMIN")
public String findManagList() {return "book_manag";
}

 @PreAuthorize注解会在方法执行前进行权限验证,支持SpEL表达式。

@RequestMapping("list")
@PreAuthorize("hasAnyRole('ROLE_ADMIN','ROLE_COMMON')")
public String findList() {return "book_list";
}
@RequestMapping("admin/manag")
@PreAuthorize("hasRole('ROLE_ADMIN')")
public String findManagList() {return "book_manag";
}

@Secured、@RolesAllowed和@PreAuthorize注解都可以对方法的访问进行权限控制。 @Secured为Spring Security提供的注解。

@RolesAllowed为基于JSR 250规范的注解。

@PreAuthorize支持SpEL表达式。

Spring Security默认是禁用方法级别的安全控制注解,要想使用注解进行方法授权,可以使用@EnableGlobalMethodSecurity注解开启基于方法的安全认证机制,该注解可以标注在任意配置类上。

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true,jsr250Enabled = true,prePostEnabled = true)
public class WebSecurityConfig  {……}

(1)开启基于方法的安全认证机制 在项目的WebSecurityConfig配置类中开启基于方法的安全认证机制,并将类中HttpSecurity对象设置的访问“图书管理”拦截规则删除,以确保对资源授权地为方法授权,修改后的代码如下所示。

@Configuration
@EnableGlobalMethodSecurity(securedEnabled = true ,prePostEnabled = true )
public  class  WebSecurityConfig {
@Bean
public  PasswordEncoder passwordEncoder() {
return  new  BCryptPasswordEncoder();
}
@Bean
public  SecurityFilterChain securityFilterChain(HttpSecurity http) throws  Exception {
http.authorizeRequests() // 定义哪些URL需要被保护、哪些不需要被保护
.mvcMatchers("/loginview","/css/**","/img/**").permitAll()
.anyRequest().authenticated() // 任何请求,登录后才可以访问
.and()
.formLogin()
.loginPage("/loginview")
.loginProcessingUrl("/doLogin")
.permitAll()
.and()
.csrf().disable()//禁止csrf 跨站请求保护;
.headers().frameOptions().sameOrigin();
return  http.build();
}
}

(2)方法授权

在BookController类的findManagList()方法上使用注解指定访问该方法所需的角色

@Controller
@RequestMapping("book")public  class  BookController {
@RequestMapping("list")
public  String findList() {
return  "book_list";
}
@RequestMapping("admin/manag")
@Secured("ROLE_ADMIN")
public  String findManagList() {
return  "book_manag";
}
}

(3)测试效果

启动项目,在浏览器中通过“http://localhost:8080/”访问项目首页后,使用用户zhangsan登录系统。

单击左侧的“图书管理”链接。

在用户登录页面使用用户lisi进行登录,登录成功后再次访问“图书管理”。

动态展示菜单

掌握动态展示菜单,能够通过Spring Security的授权管理实现动态展示菜单。

在前面的讲解中,只是通过Spring Security对后台资源的访问根据角色进行权限控制,前端页面并没有做任何处理,不同角色能看到的前端页面是一样的,即使当前用户没有对应的访问权限,依然能看到对应的菜单,用户体验较差。下面在前面案例的基础上,讲解如何使用Spring Security与Thymeleaf整合实现前端页面根据登录用户的角色动态展示菜单。 

1.添加依赖

添加Thymeleaf与Spring Security 5的集成包:thymeleaf-extras-springsecurity5

<dependency><groupId>org.thymeleaf.extras</groupId><artifactId>thymeleaf-extras-springsecurity5</artifactId>
</dependency>

2.修改页面代码

打开后台首页main.html,引入Spring Security安全标签,并在页面中根据需求使用Spring Security标签指定为不同角色显示不同的页面内容,实现动态展示控制

<html xmlns:th="http://www.thymeleaf.org"xmlns:sec="http://www.thymeleaf.org/extras/spring-security"><head><meta charset="utf-8"><title>网上图书馆</title><headers><frame-options policy="SAMEORIGIN" /></headers><link rel="stylesheet" th:href="@{/css/bootstrap.css}"><link rel="stylesheet" th:href="@{/css/AdminLTE.css}"><link rel="stylesheet" th:href="@{/css/_all-skins.min.css}"><script th:src="@{/js/jquery.min.js}"></script><script th:src="@{/js/bootstrap.js}"></script><script type="text/javascript">function SetIFrameHeight() {var iframeid = document.getElementById("iframe");if (document.getElementById) {/*设置 内容展示区的高度等于页面可视区的高度*/iframeid.height = document.documentElement.clientHeight;}}</script></head><body class="hold-transition skin-green sidebar-mini"><div class="wrapper"><!-- 页面头部 --><header class="main-header"><!-- Logo --><a th:href="@{/}" class="logo"><span class="logo-lg"><b>网上图书馆</b></span></a><!-- 头部导航 --><nav class="navbar navbar-static-top"><div class="navbar-custom-menu"><ul class="nav navbar-nav"><li class="dropdown user user-menu"><a th:if="${session.user !=null}"><img th:src="@{/img/user.jpg}" class="user-image"alt="User Image"><span class="hidden-xs" th:text="${session.user.name}"></span>
</a></li><li class="dropdown user user-menu"><a><span class="hidden-xs">注销</span></a></li></ul></div></nav></header><!-- 页面头部 /--><!-- 导航侧栏 --><aside class="main-sidebar"><section class="sidebar"><ul class="sidebar-menu"><li sec:authorize="hasAnyAuthority('ROLE_COMMON','ROLE_ADMIN')"><a th:href="@{/book/list}" target="iframe"><i class="fa fa-circle-o"></i>图书阅读</a></li><li sec:authorize="hasAuthority('ROLE_ADMIN')"><a th:href="@{/book/admin/manag}" target="iframe"><i class="fa fa-circle-o"></i>图书管理</a></li></ul></section><!-- /.sidebar --></aside><!-- 导航侧栏 /--><!-- 内容展示区域 --><div class="content-wrapper"><iframe width="100%" id="iframe" name="iframe" onload="SetIFrameHeight()"frameborder="0" ></iframe></div></div></body></html>

3.效果测试

重启项目。

使用用户zhangsan的信息进行登录,登录后展示后台首页。

使用用户lisi的信息进行登录,登录后展示后台首页。

相关文章:

Spring Security授权管理

授权是Spring Security的核心功能之一&#xff0c;是根据用户的权限来控制用户访问资源的过程&#xff0c;拥有资源的访问权限则可正常访问&#xff0c;没有访问的权限时则会被拒绝访问。认证是为了保证用户身份的合法性&#xff0c;而授权则是为了更细粒度地对隐私数据进行划分…...

2025A卷-正整数到Excel编号之间的转换

题目描述 用过 excel 的都知道excel的列编号是这样的&#xff1a; a b c … z aa ab ac … az ba bb bc … yz za zb zc … zz aaa aab aac … 分别代表以下编号&#xff1a; 1 2 3 … 26 27 28 29 … 52 53 54 55 … 676 677 678 679 … 702 703 704 705 … 请写个函数&…...

算法设计与分析(期末试卷)

目录 一、频度计算&#xff08;15 分&#xff09; 二、项目工期问题&#xff08;20 分&#xff09; 三、TSP 问题的贪心算法&#xff08;15 分&#xff09; 四、“秤心如意”&#xff08;15 分&#xff09; 五、工作指派问题&#xff08;20 分&#xff09; 六、计算复杂度…...

springboot(2.6.13)自定义用户授权管理

1.自定义用户访问控制 a.重写configure(HttpSecurity http)方法 在自定义配置类SecurityConfig中重写 Override protected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/deta…...

JavaWeb:vueaxios

一、简介 什么是vue? 快速入门 <!-- 3.准备视图元素 --><div id"app"><!-- 6.数据渲染 --><h1>{{ msg }}</h1></div><script type"module">// 1.引入vueimport { createApp, ref } from https://unpkg.com/vu…...

uniapp常用

1.下载文件带进度提示 <template> <view> <button click"startDownload">下载文件</button> <progress :percent"progress" stroke-width"3" /> </view> </template> <…...

etcd 的安装及使用

介绍 Etcd 是一个 golang 编写的分布式、高可用的一致性键值存储系统&#xff0c;用于配置共享和服务发现等。它使用 Raft 一致性算法来保持集群数据的一致性&#xff0c;且客户端通过长连接 watch 功能&#xff0c;能够及时收到数据变化通知&#xff0c;相较于 Zookeepe…...

uni-app vue3 实现72小时倒计时功能

功能介绍 &#xff0c;数组项有一个下单时间 &#xff0c;比如今天下单在72小时内可以继续支付&#xff0c;超过则默认取消订单 页面按钮处 加上倒计时 <!-- 倒计时 --> <text v-if"item.timeLeft > 0">{{ formatTime(item.remaining) }}</text&g…...

【C语言】初阶算法相关习题(二)

个人主页&#xff1a;夜晚中的人海 文章目录 ⭐一、两数之和&#x1f3e0;二、珠玑妙算&#x1f3a1;三、寻找奇数&#x1f680;四、截取字符串&#x1f389;五、寻找峰值 ⭐一、两数之和 题目描述&#xff1a;两数之和 解题思路&#xff1a; 1.先创建一个动态分配的数组ret&a…...

Flutter 学习之旅 之 Flutter 和 Android 原生 实现数据交互的MethodChanel和EventChannel方式的简单整理

Flutter 学习之旅 之 Flutter 和 Android 原生 实现数据交互的MethodChanel和EventChannel方式的简单整理 目录 Flutter 学习之旅 之 Flutter 和 Android 原生 实现数据交互的MethodChanel和EventChannel方式的简单整理 一、简单介绍 二、Flutter 和 Android 原生之间的数据…...

STM32的SysTick

SysTick介绍 定义&#xff1a;Systick&#xff0c;即滴答定时器&#xff0c;是内核中的一个特殊定时器&#xff0c;用于提供系统级的定时服务。该定时器是一个24位的递减计数器&#xff0c;具有自动重载值寄存器的功能。当计数器到达自动重载值时&#xff0c;它会自动重新加载…...

【JS事件循环机制event-loop】

目录 0、总结1、Event-Loop 概念2、宏任务-微任务3、事件循环执行机制4、调用栈5、示例 0、总结 Tasks execute in order, and the browser may render between them 【宏任务按序执行&#xff0c;浏览器可以在它们之间进行渲染】Microtasks execute in order, and are execut…...

对比N+1查询和关联聚合查询

通常我们管第一种模式叫 “N1 查询”&#xff0c;第二种叫 “关联聚合查询”。下面从几个角度来比较&#xff0c;帮助你做出选择。 1. 性能与资源消耗 方案SQL 语句数网络往返次数数据库负载Java 处理N1 查询&#xff08;先查项目&#xff0c;再遍历项目查设备状态数&#xff…...

优化 Flutter 应用启动:从冷启动到就绪仅需 2 秒

冷启动序列剖析&#xff1a;冷启动时&#xff0c;Flutter 应用需经历引擎和 Dart VM 初始化、启动 Dart Isolate、渲染第一帧等步骤。Android 和 iOS 系统分别通过启动屏幕和 Storyboard 缓解启动延迟。应用大小、初始化工作、调试模式下的 JIT 编译等因素会影响冷启动时间。优…...

牟乃夏《ArcGIS Engine 地理信息系统开发教程》学习笔记 4-空间分析与高级功能开发

目录 一、核心组件与接口回顾 &#xff08;一&#xff09;空间分析基础架构 &#xff08;二&#xff09;网络分析模块 二、矢量数据空间分析实战 &#xff08;一&#xff09;缓冲区分析 &#xff08;二&#xff09;叠加分析&#xff08;以裁剪为例&#xff09; 三、栅格…...

UE 滚动提示条材质制作

需要两个贴图 先制作条纹屏闪 这里RGB输出连到alpha&#xff0c;0为白色&#xff0c;到1就为黑色了 因为这个图片是RGB输出代表三个图片&#xff0c;看贴图颜色就知道了&#xff0c;然后把这三个相加一下&#xff1b;链接自发光颜色&#xff0c; 这里设置速度变量 通过网盘分…...

金融业数字化转型——深入解读77页2024年中国金融体系指标大全【附全文阅读】

本文主要介绍了金融业通行宝典中国金融体系指标大全的内容,包括央行体系、商业银行体系、非银金融机构与地方金融组织的各项指标。文章详细分析了美联储资产负債表的结构,并概述了美日欧等主要经济体资产负债表状况。 重点内容: 1. 央行体系是金融分析的重点。 2. 美联储资产…...

研究:大模型输出一致性:确定性与随机性的场景化平衡

大模型在相同输入下的输出是否一致,本质上取决于其设计目标、任务性质以及技术实现方式。这一问题需要从技术原理、应用场景、用户需求三个维度进行深度分析: 一、技术实现:确定性与随机性的平衡 模型架构的确定性基础 大模型的核心参数(如权重矩阵)在训练完成后是固定的…...

数据分析1

一、常用数据处理模块Numpy Numpy常用于高性能计算&#xff0c;在机器学习常常作为传递数据的容器。提供了两种基本对象&#xff1a;ndarray、ufunc。 ndarray具有矢量算术运算和复杂广播能力的快速且节省空间的多维数组。 ufunc提供了对数组快速运算的标准数学函数。 ndar…...

vmare pro安装报错用户在命令行上发出了EULAS_AGREED=1,表示不接受许可协议的错误解决方法

问题现状和原因 用户在命令行上发出了EULAS_AGREED1&#xff0c;表示不接受许可协议的错误。 以上错误主要原因是因为机器安装过了vmare 卸载时没有卸载干净导致的。 解决方法&#xff1a; 1、控制面板-程序和功能-卸载程序。找到vamre卸载掉。 2、打开开始菜单输入注册表 …...

《Linux篇》基础开发工具——vim详细介绍

文章目录 1.软件包管理1.1 什么是软件包1.2 Linux软件生态 2.编辑器vim2.1 vim的正常/命令模式2.2 vim的末行模式2.3 vim的插入模式 3.配置vim 1.软件包管理 我们先来看一下再Linux是那个如何安装软件&#xff1f; 源码安装&#xff1a;软件是存在相互依赖的关系的&#xff0…...

AI图片跳舞生成视频,animate X本地部署。

本期内容打包限时免费下载https://www.kdocs.cn/l/cnQ5lNU5DFZB 对比不同算法&#xff0c;使用同一组图片和舞蹈视频。animate X官网&#xff0c;下载项目解压。按照官方教程下载模型&#xff0c;项目包和命名好的模型包已上传网盘&#xff0c;放到解压目录下即可。 安装好cond…...

Web技术与Apache网站部署

一、Web 基础与 HTTP 协议 1.1 静态网页与动态网页 静态网页 定义&#xff1a;由纯 HTML、CSS、JavaScript 构成&#xff0c;文件扩展名为 .htm 或 .html。内容在服务器生成后固定不变&#xff0c;仅通过客户端脚本&#xff08;如 JS&#xff09;实现视觉动态效果&#xff08…...

第七章:Server/Client Communication

Chapter 7: Server/Client Communication 从工具集成到服务器通信&#xff1a;如何让AI“远程协作”&#xff1f; 在上一章的工具与LLM集成中&#xff0c;我们已经能让AI调用真实世界的工具。但你是否想过&#xff1a;如果多个用户同时请求天气查询&#xff0c;或者需要远程控…...

Linux调试器 - gdb使用指南

目录 一、背景知识 二、开始使用 gdb &#xff08;一&#xff09;查看源代码相关指令 &#xff08;二&#xff09;程序执行控制指令 &#xff08;三&#xff09;断点相关指令 &#xff08;四&#xff09;变量操作相关指令 &#xff08;五&#xff09;其他常用指令 在Li…...

C++面试常青客:LRUCache最近最少使用算法

C面试常青客&#xff1a;LRUCache最近最少使用算法 文章目录 C面试常青客&#xff1a;LRUCache最近最少使用算法1.背景&#x1f3c6;2.原理&#x1f680;2.1基本原理2.2核心特性 3.结构3.1为什么需要 list<pair<int,int>>&#xff08;双向链表&#xff09;&#xf…...

【含文档+PPT+源码】基于微信小程序的社交摄影约拍平台的设计与实现

项目介绍 本课程演示的是一款基于微信小程序的社交摄影约拍平台的设计与实现&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含&#xff1a;项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系…...

jetson nano上Ubuntu系统调用摄像头bug

今天在做一个比赛的时候&#xff0c;通过调用摄像头做检测并输出目标角度和距离。刚开始用的是 cv::VideoCapture cap; cap.open("/dev/video0");没有任何问题&#xff0c;使用pnp解算得到的角度和距离都是正确的&#xff0c;画面也是小画面。 后面加了一些功能&…...

用Python做有趣的AI项目5:AI 画画机器人(图像风格迁移)

这个项目将使用 PyTorch 实现图像风格迁移&#xff08;Neural Style Transfer&#xff09;&#xff0c;让一张图片看起来具有另一张图片的“艺术风格”。 &#x1f527; 开发环境建议 Python 3.8 PyTorch&#xff08;pip install torch torchvision&#xff09; PIL&#x…...

一种用于从视网膜图像中识别疾病的 BERT 式自监督学习 CNN

大家读完觉得有帮助记得关注和点赞&#xff01;&#xff01;&#xff01; 抽象 在医学成像领域&#xff0c;深度学习的出现&#xff0c;尤其是卷积神经网络 &#xff08;CNN&#xff09; 的应用&#xff0c;彻底改变了医学影像的分析和解释。然而&#xff0c;深度学习方法通常依…...

OpenCV 图形API(68)图像与通道拼接函数------垂直拼接两个图像/矩阵的函数concatVert()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 对给定的矩阵执行垂直拼接。该函数将两个 GMat 矩阵&#xff08;列数相同&#xff09;垂直连接&#xff1a; GMat A { 1, 7,2, 8,3, 9 }; GMat…...

重测序关系矩阵构建方式汇总

样本间亲缘关系矩阵&#xff08;kinship matrix&#xff09;和同源性矩阵&#xff08;IBS matrix&#xff09;构建的方式 1. 可以使用plink的–make-rel计算个体之间的亲缘关系&#xff08;强调个体之间的遗传相似性&#xff09; /opt/software/plink --bfile vcf_bfile--mak…...

OpenCV 图形API(70)图像与通道拼接函数-----创建一个图像或矩阵(GMat)的副本的操作函数copy()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 制作输入图像的一个副本。请注意&#xff0c;这个副本可能不是实际存在的&#xff08;没有实际复制数据&#xff09;。使用此函数来维护图的契约…...

30天通过软考高项-第六天

30天通过软考高项-第六天 任务&#xff1a;项目质量管理 思维导图阅读 知识点集锦阅读 知识点记忆 章节习题练习 知识点练习 手写回忆ITTO 听一遍喜马拉雅关于范围的内容 质量管理 -背 1. 过程定义 龟管控 要求标准规划定&#xff0c;计划转化看过程&#xf…...

JUC中各种锁机制的应用和原理及死锁问题定位

JUC中各种锁机制的应用和原理及死锁问题定位 在互联网大厂Java求职者的面试中&#xff0c;经常会被问到关于JUC&#xff08;Java Util Concurrency&#xff09;中的各种锁机制及其应用和原理的问题。本文通过一个故事场景来展示这些问题的实际解决方案。 第一轮提问 面试官&…...

区块链vs实体经济:一场金融、医疗、政务与物流的“效率革命”

区块链技术作为一种去中心化、不可篡改的分布式账本技术&#xff0c;正在重塑多个行业的运行模式。从金融交易的透明化到医疗数据的安全共享&#xff0c;从政务服务的效率提升到物流供应链的全程可追溯&#xff0c;区块链的跨行业应用展现出巨大的潜力与价值。以下是其在金融、…...

FTP-网络文件服务器

部署思路 单纯上传下载ftp系统集成间的共享 samba网络存储服务器 NFS 网络文件服务器&#xff1a;通过网络共享文件或文件夹&#xff0c;实现数据共享 NAS &#xff08; network append storage):共享的是文件夹 FTP&#xff1a;文件服务器samba&#xff1a;不同系统间的文件…...

嵌入式RTOS实战:uC/OS-III最新版移植指南(附项目源码)

文章目录 前言一、uC/OS简介二、工程移植2.1 下载ucos源码2.2 创建空白工程2.3 拷贝ucosiii源码文件2.3.1 UC-CONFIG2.3.2 UC-CPU2.3.3 UC-LIB2.3.4 UC-OS3 2.3 添加工程文件分组及路径2.4 代码首次编译2.5 源码修改2.5.1 cpu_cfg.h2.5.2 os_cpu_c.c2.5.3 lib_cfg.h2.5.4 sys.h…...

10.Excel:快速定位目标值

一 批量删除 1.如何使用 快捷键 CTRLG 补充&#xff1a;直接选择定位条件。 2.作用 1.批量删除工作表中的图片 补充&#xff1a;无法通过框选的方式选中这些图片进行删除。 这样只框选了表格&#xff0c;无法框选图片。因为图片在excel中被认为是一个对象&#xff0c;对象无法通…...

状态模式 (State Pattern)

状态模式(State Pattern)是一种行为型设计模式,它允许对象在其内部状态改变时改变它的行为,对象看起来似乎修改了它的类。该模式将状态封装成独立的类,并将请求委托给当前的状态对象,当对象的内部状态发生变化时,其行为也会随之改变。 一、基础部分 1. 意图 允许一个…...

【Java面试题04】MySQL 篇

文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、MySQL 篇&#xff1a;☀️☀️☀️1、MySQL 是如何实现事务的? 后序还在更新中~~~三、总结&#xff1a;&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&#x1f680; ☀️ 你每一…...

同时安装多个版本的golang

https://golang.google.cn/dl/ go install golang.org/dl/go1.20latest 这样就会将 go1.20.exe 下载到 GOPATH/bin&#xff0c;但是此时并没有 go1.20 的源码包&#xff0c;也就不能正常执行 build/run 等指令。 然后执行 go1.20 download下载源码包 > go1.20 download …...

【Web应用服务器_Tomcat】三、Tomcat 性能优化与监控诊断

在企业级 Java Web 应用的运行过程中&#xff0c;Apache Tomcat 作为广泛使用的 Servlet 容器和 Web 服务器&#xff0c;其性能表现直接影响用户体验和业务稳定性。本篇文章将深入探讨 Tomcat 性能优化的实用技巧&#xff0c;以及如何通过有效的监控诊断手段&#xff0c;及时发…...

stm32week13

stm32学习 九.stm32与HAL库 4.时钟树 stm32f103所拥有的时钟源&#xff1a; 外部时钟的稳定性比内部的高&#xff0c;但是成本高&#xff0c;需要在外部额外接 关于上述时钟树的简图&#xff1a; 右下四个是HAL库中的初始化函数 F4的时钟树简图&#xff1a; F7的时钟树简图…...

深入探究C++ 中的stack、queue和deque

目录 一、stack&#xff08;栈&#xff09; 二、queue&#xff08;队列&#xff09; 三、deque&#xff08;双向队列&#xff09; 四、容器适配器总结 在C 的标准模板库&#xff08;STL&#xff09;中&#xff0c;stack、queue和priority_queue是非常实用的容器适配器&…...

第十二节:性能优化高频题-shallowRef/shallowReactive使用场景

适用场景&#xff1a;大型对象/列表仅需第一层响应式变化&#xff08;如JSON配置数据&#xff09; Vue3 浅层响应式 API&#xff08;shallowRef/shallowReactive&#xff09;使用场景深度解析 一、核心使用场景与性能优化原理 大型 JSON 配置数据管理 • 场景特征&#xff1a;…...

openGauss DB4AI与scikit-learn模块对比探究

openGauss当前版本支持了原生DB4AI能力&#xff0c;引入原生AI算子&#xff0c;简化操作流程&#xff0c;充分利用数据库优化器、执行器的优化与执行能力&#xff0c;获得高性能的数据库内模型训练能力。 本文介绍了笔者采用鸢尾花数据集&#xff0c;对openGauss DB4AI功能进行…...

基于大模型的公安预审办案笔录分析的挑战与应对策略-3

引言 &#xff1a;在基于大模型的公安预审办案笔录分析应用过程中&#xff0c;虽然取得了一定的成果&#xff0c;但也面临着诸多挑战。本文将分析这些挑战&#xff0c;并提出相应的应对策略&#xff0c;以推动该技术在公安领域的更好地发展和应用。 引文&#xff1a;https://c…...

ubantu18.04(Hadoop3.1.3)之Flink安装与编程实践(Flink1.9.1)

说明&#xff1a;本文图片较多&#xff0c;耐心等待加载。&#xff08;建议用电脑&#xff09; 注意所有打开的文件都要记得保存。 第一步&#xff1a;准备工作 本文是在之前Hadoop搭建完集群环境后继续进行的&#xff0c;因此需要读者完成我之前教程的所有操作。 注意本次实…...

AI辅助编程-cursor开发煤矿持证上岗管理程序需求与设计篇

​ Cursor 是一款由人工智能驱动的智能代码编辑器&#xff0c;深度融合AI技术以提升开发效率。其核心功能基于GPT-4等先进模型&#xff0c;支持代码生成、错误修复、智能补全及自然语言编程。开发者可通过对话交互直接描述需求&#xff0c;AI即时生成对应代码片段&#xff0c;显…...