Spring Security详细学习第二篇(授权,异常处理,跨域)

SpringSecurity

  • 授权
  • 从数据库中获取权限信息
    • RBAC权限模型
  • 异常处理
  • 跨域问题

授权

权限系统可以使得不同的用户可以使用不同的功能
所以我们需要在后端进行相应的权限判断,判断当前用户是否具有相应的权限,必须基于所需权限才能进行相应的操作

  • 授权原理

在SpringSecurity中,会使用默认的FilterSecurityInterceptor来进行权限校验,在FilterSecurityInterceptor中会从securityContextHolder获取其中的Authentication,然后获取其中的权限信息,当前用户是否拥有访问当前资源所需的权限

框架提供了基于注解的权限控制的方案:
开启权限注解的相关配置:

@EnableGlobalMathodSecurity(prePostEnabled= true)

注解放在所继承WebSecurityConfigurerAdapter的配置类上
然后可以使用对应的权限注解

@RestController
public class HelloController{
   @RequestMapping("/hello")
   @PreAuthorize("hasAuthority('test')")
   public String hello(){
       return "hello";
   }
}

注解中的hasAuthority是一个方法,在进行判断的时候根据注解中传入的参数进行方法来进行判断

我们需要对UserDetails中完善授权信息部分:
在实现UserDetails的实现类中由方法getAuthorities()来返回控制权限的信息

public class userdatails implements UserDetails{
     private List<String> primissions;
     @JSONField(serialize=false)
     private List<SimpleGrantedAuthority> authorities;
     public Colletion<? extends GrantedAuthority> getAuthorities(){
       if(authorities!=null)
       {
          return authorities;
       }
       authorities=permissions.stream()
               .map(SimpleGrantedAuthority::new)
               .collect(Collectors.toList());
       return authorities;
     }
}

在这个之中我们从数据库访问回来的权限信息放在List集合之中,但是在重写的方法getAuthorities()中它的返回信息是一个继承自GrantedAuthority的对象集合,我们需要将权限信息封装成每一个它的子类对象SimpleGrantedAuthority但是我们需要将控制信息放在redis中,不能够将spring提供的该对象进行序列化保存,所以我们需要通过注解 @JSONField对这个对象集合进行忽略,我们只需要将primissions进行序列化保存即可

在实现UserDetailsService的实现类中,我们封装一个权限集合并同User信息一起返回

public class UserDetailsserviceimpl implements UserDetailsService{
 
    //封装一个权限的List集合
    List<String> list=new ArrayList<>(Arrays.asList("test"));
    return new User(user,list);
}

在jwt过滤器中再将之前封装到UserDetails的权限信息封装到Authentication中
具体的过滤器请看博主第一篇,博主在这里对之前的内容进行添加

  UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken=new UsernamePasswordAuthenticationToken(user,null,user.getAuthorities());
        SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);

从数据库中获取权限信息

RBAC权限模型

RBAC权限模型(Role-Based Access Control)基于角色的权限控制

上述我们在获取数据库中权限信息中我们直接给定权限信息:

   List<String> list=new ArrayList<>(Arrays.asList("test"));

但在真实中是通过数据库来的

我们可以将所有的操作权限放在一个权限表中:

id权限信息
1删除图书
2查看图书

比如这样的表中,这时我们应该为用户表中的用户配备它的权限,但是由于权限太多,我们需要在启用一个表角色表,将对应的很多权限成组赋予这个角色,而用户表中的每个用户就只用承担对应的角色即可

一个角色可以由多个权限,一个权限可以赋予多个角色,属于多对多的关系,我们可以在创建一个关联表来实现它的关联关系

例如:

角色id权限id
11
12
22

而用户和角色之间也是一个多对多的关系也需要一个关联表来实现它们的关系

创建权限对应的实体类 (我们默认实体类为qxtable)
在Mapper层下实现一个查询权限信息的多表查询的操作,再将查询到的权限字符串封装到List集合当中在封装到UserDetails中

异常处理

在SpringSecurity中,如果我们在认证或者授权失败之后异常会被ExceptionTranslationFilter过滤器捕获到,
如果是认证失败出现的异常会被封装到AuthenticationException然后调用AuthenticationEntryPoint对象的方法去进行异常处理
如果是认证过程中出现的异常会被封装为AccessDeniedException然后调用AccessDenielHandler对象的方法去进行异常处理
将上述两个对象配置到SpringSecurity的配置类当中

//配置异常处理器
http.exceptionHandling()
     
     .authenticationEntryPoint(authenticationEntryPoint)
     .accessDeniedHandler(accessDeniedHandler)

跨域问题

跨域问题通常是由浏览器的安全策略所引起的,称为同源策略(Same-Origin Policy),它限制了页面从一个源加载的文档或脚本如何与来自另一个源的资源进行交互。

我们通过SpringMVC提供的WebMvcConfigurer接口可以配置CORS头部,来解决跨域请求问题:

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        //设置允许跨域的路径
        registry.addMapping("/**")
                 //设置允许跨域请求的域名
                .allowedOrigins("*")
                //设置允许的请求方式
                .allowedMethods("GET", "POST", "PUT", "DELETE")
                //设置允许的header属性
                .allowedHeaders("Content-Type", "Authorization")
                //是否允许使用cookie
                .allowCredentials(true)
                //跨域允许时间
                .maxAge(3600);
    }
}

上述是SpringBoot中允许跨域的配置,但是在使用了SpringSecurity之后,由于资源被SpringSecurity进行保护,所以我们要进行跨域访问还要让SpringSecurity运行跨域访问

这里我们仍然在SpringSecurity中的configure方法中进行跨域配置

//允许跨域配置
http.cors();

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

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

相关文章

数据结构习题-- 相交链表

数据结构习题-- 相交链表 给你两个单链表的头节点 headA 和 headB &#xff0c;请你找出并返回两个单链表相交的起始节点。如果两个链表不存在相交节点&#xff0c;返回 null 如上图&#xff0c;返回c1结点 注意&#xff1a;这两个链表非环形 方法&#xff1a;集合 分析 由…

关于ERA5气压和温度垂直补偿公式的对比情况

1. 气压和温度垂直补偿对比 「谨代表给个人观点&#xff0c;杠精请自测&#xff0c;对对对&#xff0c;好好好&#xff0c;你说啥都对」。 使用2020-2022陆态网GNSS与探空站并址的48个站点实验&#xff0c;以探空站为真值&#xff0c;验证ERA5精度。怎么确定并址请看前面文章…

Django中的实时通信:WebSockets与异步视图的结合

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在现代Web应用程序中&#xff0c;实时通信已经成为了必不可少的功能之一。无论是在线聊天、…

UKP3D,出轴 /平面图时,选项中出图比例,绘图比例,打印比例的区别

Q:用户问&#xff0c;轴测图正常&#xff0c;平面图位置不对&#xff0c;这个也需要在xml里面调整吗&#xff1f; 在此&#xff0c;先不回复上述问题&#xff0c;而是解释在出图规则里的选项意思。 1.图框比例&#xff1a;图框比例1:100&#xff0c;例如选中的图幅是A0横式&…

现代图形API综合比较:Vulkan | DirectX | Metal | WebGPU

Vulkan、DirectX、Metal 和 WebGPU 等低级图形 API 正在融合为类似于当前 GPU 构建方式的模型。 图形处理单元 (GPU) 是异步计算单元&#xff0c;可以处理大量数据&#xff0c;例如复杂的网格几何形状、图像纹理、输出帧缓冲区、变换矩阵或你想要计算的任何数据。 NSDT工具推荐…

TFS(淘宝分布式存储引擎

TFS&#xff08;淘宝分布式存储引擎&#xff09; 什么是TFS&#xff1f; ​ 根据淘宝2016年的数据分析&#xff0c;淘宝卖家已经达到900多万&#xff0c;有上十亿的商品。每一个商品有包括大量的图片和文字(平均&#xff1a;15k)&#xff0c;粗略估计下&#xff0c;数据所占的…

编译一个基于debian/ubuntu,centos,arhlinux第三方系统

目录 前言 准备工作 下载linux源码进行编译 linux源码下载 网站 问题 解决办法 编译 可能会遇到的问题 chroot下载debian环境 进入虚拟环境 把chroot的根目录文件打包为.gz文件 编译init文件&#xff08;用于系统启动时的一系列引导&#xff09; 给予文件夹权限 …

pip下载包opencv出错(报错failed building wheel for opencv-python解决方法)

文章目录 1 报错2 原因3 解决方法参考 1 报错 ERROR: Could not build wheels for opencv-python, which is required to install pypr2 原因 版本不兼容的问题,当使用pip install opencv-python命令安装的是最新版本&#xff0c;当前python版本不支持。需要安装当前版本pyth…

34. 【Android教程】菜单:Menu

作为 Android 用户&#xff0c;你一定见过类似这样的页面&#xff1a; 它就是我们今天的主角——菜单&#xff0c;它的使用场景和作用不用多说&#xff0c;几乎每个 App 都会用到它&#xff0c;今天我们就一起来看看 Android 提供的几种菜单类型及用法。 1. 菜单的几种类型 根…

✌粤嵌—2024/4/12—插入区间✌

代码实现&#xff1a; 解题思路&#xff1a;先将数组 newInterval 插入到数组 intervals 的末尾&#xff0c;再转换成合并区间 /*** Return an array of arrays of size *returnSize.* The sizes of the arrays are returned as *returnColumnSizes array.* Note: Both returne…

LabVIEW专栏六、LabVIEW项目

一、梗概 项目&#xff1a;后缀是.lvproj&#xff0c;在实际开发的过程中&#xff0c;一般是要用LabVIEW中的项目来管理代码&#xff0c;也就是说相关的VI或者外部文件&#xff0c;都要放在项目中来管理。 在LabVIEW项目中&#xff0c;是一个互相依赖的整体&#xff0c;可以包…

319_C++_使用QT自定义的对话框,既能选择文件也能选择文件夹,为什么使用QListView和QTreeView来达成目的?

解析 1: 在 Qt 中,QFileDialog::setOption 方法用于设置文件对话框的一些选项,以改变其行为或外观。QFileDialog::DontUseNativeDialog 是这些选项之一,当设置为 true 时,它会告诉 QFileDialog 不要使用操作系统提供的原生文件对话框,而是使用 Qt 自己实现的对话框样式。…

js作业微博发言与轮播(有瑕疵)

微博 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compatible" content&q…

H5 台球猜位置小游戏

刷到抖音有人这样玩&#xff0c;就写了一个这样的小游戏练习一下H5的知识点。 小游戏预览 w(&#xff9f;Д&#xff9f;)w 不开挂越急越完成不了&#xff0c;&#x1f47f;确认15次也没全对… 知识点 获取坐标位置的DOM元素&#xff0c;感觉应该是新的吧&#xff0c;以前的…

Aws Nat Gateway

要点 NAT网关要能访问外网&#xff0c;所以需要部署在有互联网网关的Public子网中。 关键&#xff1a; NAT网关创建是选择子网&#xff0c;一定要选择公有子网&#xff08;有互联网网关子网&#xff09; 特别注意&#xff1a; 新建nat网关的时候&#xff0c;选择的子网一定…

jeecgflow之camunda工作流-并行网关

引言 书接上回&#xff0c;继续三国流程系列教程。 本文主要讲解并行网关。 并行网关允许流程中的多个任务同时执行&#xff0c;从而提高流程的执行效率。 并行网关会忽视序列流上的条件设置。 并行网关分为两部分。 Fork: 用于任务开始 Join:用于任务结束 体验文章demo演示站…

【Camera Framework笔记】二、Camera Native Framework架构①

一、总体架构&#xff1a; service -> opencamera -> client&#xff08;api1/api2&#xff09; -> device3&#xff08;hal3&#xff09; | | &#xff08;不opencamera…

kubernetes学习

1、应用部署方式演变 2、kubernetes介绍 3、kubernetes组件 4、kubernetes概念 5、环境搭建-环境规划 集群类型&#xff1a; 安装方式&#xff1a; 主机规划&#xff1a; 6、环境搭建-主机安装 使用虚拟机安装三台centos7&#xff08;一主二从&#xff09;&#xff0c;然后在…

相机摄影入门技巧,数码摄影技巧大全

一、资料前言 本套数码相机摄影资料&#xff0c;大小1.08G&#xff0c;共有42个文件。 二、资料目录 《aking人像摄影技巧分享》.pdf 《Nikon.D90数码单反摄影技巧大全》FUN视觉.全彩版.pdf 《不可不学的摄影技巧》.pdf 《常用场景摄影》.pdf 《单反数码摄影专家技法》.…

ASP.NET基于Web的招投标系统的设计与实现

摘 要 招标拍卖的历史悠久&#xff0c;在近两千年的发展历程中&#xff0c;人们对拍卖的理论和技术做了大量的探讨。随着计算机网络技术的迅猛发展和日益成熟&#xff0c;为了提高招投标及采购工作的效率&#xff0c;为廉政建设和防止腐败提供技术保障&#xff0c;传统的拍…