springboot集成security(鉴权)

news2025/1/6 21:42:00

本文承接上一章节内容:springboot集成security(认证)

上一章节: https://blog.csdn.net/m0_54355172/article/details/128239128

1. 授予静态资源访问权限

因为我的演示案例涉及到多个页面,所以先说一下如何给静态资源授予访问权限。

不过首先,我先来讲一下 springboot中无法访问到静态资源的问题的处理方案,这个不涉及security。

1. springboot访问不到静态资源的处理方案

一般,我们会把 .html 和其对应的 静态资源(.css.js.png)分开放置:

  • .html 放到 /resources/templates/
  • 静态资源放到 /resources/static/**

可是,我们会发现,这样放置,在启动项目的时候,根本访问不到静态资源,其解决方案如下:

  • 修改启动类:

    @MapperScan("com.chenjy.security_demo.mapper")
    @SpringBootApplication
    public class SecurityDemoApplication extends WebMvcConfigurationSupport {
    
        public static void main(String[] args) {
            SpringApplication.run(SecurityDemoApplication.class, args);
        }
    
        @Override
        protected void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/css/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX + "/static/css/");
            super.addResourceHandlers(registry);
        }
    }
    
    • extends WebMvcConfigurationSupport,重写 addResourceHandlers
    • 在方法中增加对 /css 路径的映射。
  • 修改html:

    <html lang="en" xmlns:th="https://www.thymeleaf.org">
    <head>
      <base th:href="@{/}">
      <meta charset="UTF-8">
      <title>登录</title>
      <link rel="stylesheet" href="../../static/css/login.css" th:href="@{/css/login.css}"/>
    </head>
    
    • html 标签的 xmlns:th=“https://www.thymeleaf.org” 引用不能缺少
    • head 标签里增加 <base th:href=“@{/}”> 配置
    • 修改 link 标签 <link rel=“stylesheet” href=“…/…/static/css/login.css” th:href=“@{/css/login.css}”/>

2. 授权访问静态资源

经过上述配置之后,我们如果不使用 security 的话,就能访问到静态资源了,但是当我们使用了 security,那么我们会发现,又访问不到静态资源了。

这是因为,我们没有权限访问静态资源,所以,我们需要授权访问静态资源。

.antMatchers("/**/*.css") // 从根目录开始,授予所有目录下的所有 .css 文件的可访问权限
.permitAll()

2. 权限授予的方法

授权都是基于路径匹配

方法说明
permitAll免登陆访问
一般描述静态资源,css、js、jpg
anonymous登录后不可访问
登录页面和登录请求
authenticated登录后可访问
denyAll任意用户任意状态都不可访问
fullyAuthenticated完整登录才可访问
收支
rememberMe记住我,一段时间内访问免登陆

上面所有方法的底层都是 access ,可以实现任何权限授予逻辑,基于权限表达式的权限授予方法。

权限表达式:

  • 定值表达式
    access(“permitAll”) 等同于 permitAll()
  • 动态表达式

3. 权限管理

1. 基于角色的权限管理(role)

role: 权限

user: 用户

role_user:映射

1. 数据库查询

根据用户名查询权限。

  • mapper

        <select id="getRoleByName" parameterType="string" resultType="string">
            select
                r.authority
            from
                role r,
                role_user ru
            where
                r.id = ru.rid
              and ru.uid = (
                select
                    rid
                from
                    role_user
                where
                    uid = ( select id from user where name = #{name} ))
        </select>
    
    String getRoleByName(String name);
    
  • service

    String getRoleByName(String name);
    
        @Override
        public String getRoleByName(String name) {
            return userMapper.getRoleByName(name);
        }
    

2. UserDetailsServiceImpl权限获取

从数据库获取对应角色的权限,并将权限封装到 UserDetails 中返回。

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        com.chenjy.security_demo.dto.User user = userService.getUserByName(username);
        if (user == null) {
            throw  new UsernameNotFoundException("用户名错误");
        }
        // 用户登录成功之后,查询用户的权限集合,包括角色和权限
        // security 严格要求:角色名的前缀必须是ROLE_,在代码中拼接
        // 角色和权限是平等的,都是权限
        String auth = "ROLE_" + userService.getRoleByName(username);
        System.out.println(username + "的权限是:" + auth);

        // 匹配用户密码
        // createAuthorityList可以装入一个字符串,也可以多个字符串,也可以直接装入一个字符串数组
        User res = new User(username, user.getPassword(), AuthorityUtils.createAuthorityList(auth));
        return res;
    }

loadUserByUsername 中, security 会等待用户登录成功之后,再去查询用户权限。

注意: security 严格要求:角色名的前缀必须是 ROLE_,但不建议在数据库中直接存入前缀,建议在代码中拼接字符串。

启动项目,登录,查看控制台输出:

3. 配置访问权限

前端代码: https://blog.csdn.net/m0_54355172/article/details/128247732

事先已经写好了两个页面:resource.html——对应接口:/resource、free.html——对应接口:/free

现在需要配置其访问权限:/resource——只有权限为 all 的用户才可以访问,/free——所有用户都可以访问。

.antMatchers("/resource")
.hasRole("all")
.antMatchers("/free")
.hasAnyRole("all", "sim")

演示一下效果:

hasRole(all) 具备 all 权限才能访问匹配到的路径。
hasAnyRole(“all”, “sim”) 具备 allsim 中任意一个权限就可以访问匹配到的路径。

2. 基于资源的权限管理(authority)

相比于 基于角色的权限管理基于资源的权限管理 更加细粒度。

hasAuthority(“read,write”)

hasAnyAuthority(“read,write”, “read”)

3. 基于客户端ip的权限管理(IPAddress)

.antMatchers("/free")
.hasIpAddress("127.0.0.1")

注意:ip规则访问要求完整匹配,所以不能填写 localhost 作为ip。

  • 按照上述配置,localhost 就不能访问 /free

  • 通过打印访问的主机ip,可知道 localhost 的ip 为 0:0:0:0:0:0:0:1

    request.getRemoteHost()
    

    修改配置:

    .hasIpAddress("0:0:0:0:0:0:0:1")
    

    但是可以发现,localhost 依旧访问不到资源

    但是 127.0.0.1 就可以访问。

小结: 别用 localhost

未完待续…

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

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

相关文章

数据挖掘——关联规则(Association Rule)Apriori算法和python代码实现

关联规则&#xff08;Association Rule&#xff09;什么是关联规则一些基本概念任务是什么Apriori 算法核心思想步骤与流程图如何找到候选集python代码实现什么是关联规则 关联规则(Association Rules)是反映一个事物与其他事物之间的相互依存性和关联性&#xff0c;是数据挖掘…

线程2的深度剖析

加锁 synchronized 1.修饰方法&#xff08;普通方法&#xff0c;静态方法&#xff09;普通方法实际上加到了this上&#xff0c;静态方法加到了类对象上。 2.修饰代码块 手动指定加到那个对象上 明确锁对象针对那个对象加锁&#xff0c;如果两个线程针对同一个对象加锁&am…

(1)AWD入门攻略大纲

1.比赛介绍 (1)比赛环境 (2)常见服务器信息介绍 比赛名称 白名单&#xff1a;一般用于防止外部恶意攻击&#xff0c;如果赛方发现名单以外IP可能会进行封禁处理。 服务器账号密码 Token和虚拟IP&#xff1a;token为提交答案的凭证&#xff0c;绑定了队伍&#xff1b;虚拟IP为…

SpringCloud中Feign注解@FeignClient参数一览表

写在前面 Feign是微服务中服务间调用的优选组件&#xff0c;后来的OpenFeign也是基于此来开展的。 为什么要梳理一下Feign注解FeignClient中的各个参数&#xff1f; 踩坑太多面试总问 参数一栏表 FeignClient的源码示例图如下&#xff1a; 今天我们接着来说最后的几个参数。…

Java面试题(六)美团JVM夺命7连问(灵魂拷问)

0.来看一道美团的面试题 这题直接把人给问懵逼了&#xff0c;你能全部答出来吗&#xff1f; Object o new Object();请解释对象的创建过程&#xff1f;DCL要不要加volatile问题&#xff1f;对象在内存中的存储布局&#xff1f;什么是指针压缩&#xff1f;对象头具体包含哪些…

生成树问题汇总

生成树问题汇总注1、最小(大)生成树思路代码例子&#xff1a;1、最小生成树结果是2、最大生成树结果2、在最小生成树中再加一条边&#xff0c;求新的最小生成树思路代码核心代码全部代码例子3、次小生成树思路:在上一个功能基础上进一步扩充代码核心代码全部代码例子4、判断最小…

一个轻量级的分布式日志标记追踪神器,十分钟接入,非常好用!

TLog简介 1、TLog通过对日志打标签完成企业级微服务的日志追踪。它不收集日志&#xff0c;使用简单&#xff0c; 产生全局唯一的追踪码。除了追踪码以外&#xff0c;TLog还支持SpanId和上下游服务信息 标签的追加。 2、为用户使用方便而设计&#xff0c;提供完全零侵入式接入…

es入门(上)

笔记来源于学习 b站中的【IT李老师】的elasticsearch课程 自己在实习做的es模块中的理解。 后续会有 中&#xff0c;下篇笔记更新&#xff0c;目前这一篇是上篇。 目录 Elastic Stack简介 1.1简介 1.2特色 1.3组件介绍 2.Elasticsearch的接收与核心概念 2.1搜索是什么…

【Keras+计算机视觉+Tensorflow】OCR文字识别实战(附源码和数据集 超详细必看)

需要源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、OCR文字识别简介 利用计算机自动识别字符的技术&#xff0c;是模式识别应用的一个重要领域。人们在生产和生活中&#xff0c;要处理大量的文字、报表和文本。为了减轻人们的劳动&#xff0c;提高处理效率&#xff0c;从…

[python]初步练习脚本

之前练习的python&#xff0c;编写的脚本&#xff0c;现在作为记录&#xff0c;方便查看~ python 初步练习脚本基础部分的练习脚本脚本代码1、helloworld.py&#xff0c;有for循环语句2、main.py3、range—test.py&#xff0c;范围4、RE.py&#xff0c;花式输出内容5、turtle练…

Jekins安装和部署

1.官网下载 注意jekins各版本不同支持jdk的版本也不同 https://www.jenkins.io/download/ 如图进去后可看见最新版&#xff0c;而past releases是历史版本 查看自己各版本的支持 我下载的是2.346.1版本&#xff0c;是war包形式 2.启动jekins 直接在war包路径 java命令启动…

lspci命令整理

1. 作用&#xff1a; 显示当前主机的所有PCI总线信息 2. 常用指令&#xff1a; lspci -nn 第一列的数字&#xff1a;总线编号(Bus Number)&#xff1a;设备编号&#xff08;Device Number&#xff09;&#xff1a;功能编号&#xff08;Function Number&#xff09; 第一个中括…

全国青少年软件编程等级考试C语言标准解读(1_10级)

考试性质 全国青少年软件编程等级考试标准&#xff08;C/C&#xff09;由中国电子学会科普培训与应用推广中心指定。由全国青少年电子信息科普创新联盟标准工作组开发&#xff0c;由中国电子学会普及工作委员会审核通过&#xff0c;适用于由中国电子学会主办的青少年软件编程等…

vue中的process.env的理解

创建项目的时候突然发现好多前端有好多地方用到了这个process.env.xxxx但是发现其实我的新项目并没有定义这个内容&#xff0c;于是就对这个变量产生了好奇&#xff0c;这里总结一下 上图是我在node命令行下执行的查看了一下变量&#xff0c;看这情况直接是把系统的环境变量给…

少走弯路,关于在线客服系统的二三事

日常生活中&#xff0c;我们购买一个服务或一个商品时&#xff0c;时常会遇到以下场景&#xff1a; 售前咨询&#xff1a;向商家咨询服务的信息咨询、商品的规格产品咨询、以及商场活动、优惠咨询等 售后服务&#xff1a;商品使用问题、商品不满意退/换货等 在移动通信没有普…

Camera Surface 从应用到cameraserver的流转

一、Android相机应用与Surface Camera应用的预览一般通过SurfaceView去显示&#xff0c;SurfaceView作为显示的载体&#xff0c; Surface surface mSurfaceView.getSurfaceHolder().getSurface(); 获取的surface会通过Camera API1/API2的接口下发到framework层&#xff1b;…

基于模型的设计(MBD)在汽车ECU软件开发中的实践

基于模型的设计&#xff08;Model-based Design&#xff0c;以下简称MBD&#xff09;是一种围绕模型展开的项目开发方法&#xff0c;指对开发对象或者项目产品进行精确建模&#xff0c;项目的需求分析、功能设计、系统框架、代码生成、测试验证等开发环节都在模型的基础上展开。…

如何用策略模式,优化你代码里的的if-else?

最近有一个学妹在跟我沟通如何有效的去避免代码中一长串的if else判断或者switch条件判断&#xff1f;针对更多的回答就是合理的去使用设计来规避这个问题。 在设计模式中&#xff0c;可以使用工厂模式或者策略模式来处理这类问题&#xff0c;之前已经分享了工厂模式&#xff…

Hadoop集群中HDFS的API测试案例以及MapReduce的多种提交Job方式案例

这两个案例默认是hadoop集群环境已经搭建好以及IDEA环境也已经配置好 1、HDFS客户端测试案例 1.1、pom依赖 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www…

Java使用ftl模板文件生成Word,以及Word转换图片或Pdf工具类

Java使用ftl模板文件生成Word 一、写在前面 最近在项目中使用打印功能&#xff0c;发现这个功能我已经写过多次了&#xff0c;下面这个文章的发步日期在2020年&#xff0c;不得不感慨时间之快啊。 https://blog.csdn.net/weixin_43238452/article/details/109636200?spm1001…