SpringBoot响应式编程(4)Spring Security Reactive

news2024/9/27 9:25:39

一、概述

1.1应用安全

 防止攻击:
  ○ DDos、CSRF、XSS、SQL注入...
 控制权限
  ○ 登录的用户能干什么。
  ○ 用户登录系统以后要控制住用户的所有行为,防止越权;
传输加密
  ○ https
  ○ X509
认证:
  ○ OAuth2.0
  ○ JWT

1.2RBAC权限模型

Role Based Access Controll: 基于角色的访问控制

一个网站有很多用户: zhangsan

每个用户可以有很多角色

一个角色可以关联很多权限

一个人到底能干什么?

权限控制:

  • 找到这个人,看他有哪些角色,每个角色能拥有哪些权限。 这个人就拥有一堆的 角色 或者 权限
  • 这个人执行方法的时候,我们给方法规定好权限,由权限框架负责判断,这个人是否有指定的权限

所有权限框架:

  • 让用户登录进来: 认证(authenticate):用账号密码、各种其他方式,先让用户进来
  • 查询用户拥有的所有角色和权限: 授权(authorize): 每个方法执行的时候,匹配角色或者权限来判定用户是否可以执行这个方法

二、快速入门

2.1认证

1、静态资源放行

2、其他请求需要登录

 @Bean
    SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
        //1、定义哪些请求需要认证,哪些不需要
        http.authorizeExchange(authorize -> {
            //1.1、允许所有人都访问静态资源;
            authorize.matchers(PathRequest.toStaticResources()
                    .atCommonLocations()).permitAll();


            //1.2、剩下的所有请求都需要认证(登录)
            authorize.anyExchange().authenticated();
        });

        //2、开启默认的表单登录
        http.formLogin(formLoginSpec -> {
//            formLoginSpec.loginPage("/haha");
        });

        //3、安全控制:
        http.csrf(csrfSpec -> {
            csrfSpec.disable();
        });

        // 目前认证: 用户名 是 user  密码是默认生成。
        // 期望认证: 去数据库查用户名和密码

        //4、配置 认证规则: 如何去数据库中查询到用户;
        // Sprinbg Security 底层使用 ReactiveAuthenticationManager 去查询用户信息
        // ReactiveAuthenticationManager 有一个实现是
        //   UserDetailsRepositoryReactiveAuthenticationManager: 用户信息去数据库中查
        //   UDRespAM 需要  ReactiveUserDetailsService:
        // 我们只需要自己写一个 ReactiveUserDetailsService: 响应式的用户详情查询服务
        http.authenticationManager(
                new UserDetailsRepositoryReactiveAuthenticationManager(
                        appReactiveUserDetailsService)
        );
        
//        http.addFilterAt()
        //构建出安全配置
        return http.build();
    }

基于内存的使用

如果我们想配置基于内存的用户信息,该怎么配置呢?添加如下配置类即可:

@Configuration
public class SecurityConfig {
    @Bean
    MapReactiveUserDetailsService mapReactiveUserDetailsService() {
        UserDetails ud1 = User.withUsername("admin")
                .password("{noop}123")
                .roles("admin")
                .build();
        UserDetails ud2 = User.withUsername("zhangsan")
                .password("{noop}123")
                .roles("user")
                .build();
        return new MapReactiveUserDetailsService(ud1, ud2);
    }
}

 基于数据库的使用

@Component  // 定义组件,用于从数据库中按照用户名查找用户信息
public class AppReactiveUserDetailsService implements ReactiveUserDetailsService {

    // 自动注入数据库客户端
    @Autowired
    DatabaseClient databaseClient;

    // 自动注入密码编码器
    @Autowired
    PasswordEncoder passwordEncoder;

    // 实现根据用户名查找用户详细信息的方法
    @Override
    public Mono<UserDetails> findByUsername(String username) {
        // 从数据库查询用户、角色、权限所有数据的逻辑
        Mono<UserDetails> userDetailsMono = databaseClient.sql("select u.*,r.id rid,r.name,r.value,pm.id pid,pm.value pvalue,pm.description " +
                        "from t_user u " +
                        "left join t_user_role ur on ur.user_id=u.id " +
                        "left join t_roles r on r.id = ur.role_id " +
                        "left join t_role_perm rp on rp.role_id=r.id " +
                        "left join t_perm pm on rp.perm_id=pm.id " +
                        "where u.username = ? limit 1")
                .bind(0, username)
                .fetch()
                .one()// all()
                .map(map -> {
                    UserDetails details = User.builder()
                            .username(username)
                            .password(map.get("password").toString())
                            // 使用密码编码器对密码进行加密处理
                            // 权限
                            // 设置用户的角色和权限,这里使用了硬编码的方式,实际应用中应该从数据库或其他配置中获取
                            .roles("admin", "sale","haha","delete") //ROLE成功
                            .build();

                    // 返回构建好的用户详细信息对象
                    return details;
                });

        // 返回包含用户详细信息的Mono对象
        return userDetailsMono;
    }
}

这个界面点击登录,最终Spring Security 框架会使用 ReactiveUserDetailsService 组件,按照 表单提交的用户名 去数据库查询这个用户详情基本信息[账号、密码],角色权限);

把数据库中返回的 用户详情 中的密码 和 表单提交的密码进行比对。比对成功则登录成功;

2.2授权

@EnableReactiveMethodSecurity

@RestController
public class HelloController {


    @PreAuthorize("hasRole('admin')")
    @GetMapping("/hello")
    public Mono<String> hello(){

        return Mono.just("hello world!");
    }


    // 角色 haha: ROLE_haha:角色
    // 没有ROLE 前缀是权限

    //复杂的SpEL表达式
    @PreAuthorize("hasRole('delete')")
    @GetMapping("/world")
    public Mono<String> world(){
        return Mono.just("world!!!");
    }
}

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

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

相关文章

【秋招笔试】8.15联想(前端卷)-(第二套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

微软开源项目 Detours 详细介绍与使用实例分享

目录 1、Detours概述 2、Detours功能特性 3、Detours工作原理 4、Detours应用场景 5、Detours兼容性 6、Detours具体使用方法 7、Detours使用实例 - 使用Detours拦截系统库中的UnhandledExceptionFilter接口,实现对程序异常的拦截 C++软件异常排查从入门到精通系列教程…

ant design 的 tree 如何作为角色中的权限选择之二

还是接着上一节来 ant design 的 tree 如何作为角色中的权限选择之一 这里先放一下全部代码&#xff1a; import { useIntl } from umijs/max; import React, { Key, useState } from react; import { ProForm, ProFormText } from ant-design/pro-components; import { Form…

Python爬虫案例一:获取古诗文并按用户输入的作者名进行数据保存

前言&#xff1a; 1、什么是爬虫&#xff1f;也称为网页蜘蛛&#xff08;Web Spider&#xff09;&#xff0c;通俗来说&#xff0c;解放人的双手, 去互联网获取数据, 以数据库, txt, excel, csv, pdf, 压缩文件, image, video, music保存数据。本质: 模拟浏览器, 向服务器发送…

【书生大模型实战】InternVL 微调实践闯关任务

一、关卡任务 基础任务 follow 教学文档和视频使用QLoRA进行微调模型&#xff0c;复现微调效果&#xff0c;并能成功讲出梗图.尝试使用LoRA&#xff0c;或调整xtuner的config&#xff0c;如LoRA rank&#xff0c;学习率。看模型Loss会如何变化&#xff0c;并记录调整后效果(选…

消防隐患在线小程序的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;消防隐患举报管理&#xff0c;消防隐患分类管理&#xff0c;统计分类管理&#xff0c;处理结果管理&#xff0c;系统管理 微信端账号功能包括&#xff1a;系统首页&#xff0c;我…

vue+elmentui 定义狂拽黑金配色的按钮+消息框

1 修改效果 通过自定义样式的方式可以修改elmentui的配色&#xff0c;例如下面我们修改掉了button的primary配色为黑金色&#xff1a; 修改前&#xff1a; 修改后 修改了elementui 的$message(success类型&#xff09;颜色为黑金色、图标也修改为金色了&#xff1a; 修改前…

WPF 手撸插件 三 插件文件热加载

1、在程序运行的同时将插件文件复制到指定的插件目录下&#xff0c;插件自动被加载。不废话了直接上代码吧。需要的可以帮我贡献点积分&#xff0c;谢谢各位大佬了。 示例文件下载https://download.csdn.net/download/xingchengaiwei/896388912、主要功能代码如下。注意初学者…

阿里云搜索专家实操:如何高效构建企业级 AI 搜索?

作者&#xff1a;来自阿里云搜索产品专家牛俊 本文由阿里云搜索产品专家牛俊在【AI 搜索 TechDay】上的分享【阿里云 AI 搜索 Demo 展示和动手实践】整理而成。 阿里云 AI 搜索的产品能力与业务价值 阿里云 AI 搜索的方案&#xff0c;基于阿里云 Elasticsearch Inference API…

什么是国债期货?怎么玩?

国债期货&#xff0c;也就是利率期货&#xff0c;是一种在交易所里买卖未来国债价格的金融工具。它允许投资者在今天定下价格&#xff0c;然后在将来的某个时间点进行交易。在中国&#xff0c;国债期货在金融期货交易所上市&#xff0c;有几种不同的期限&#xff0c;比如30年期…

CDGA|数据治理核心能力框架与数据治理体系规划

随着数字化转型的加速和大数据技术的广泛应用&#xff0c;数据已成为企业核心资产之一。如何高效、安全地管理和利用数据&#xff0c;成为企业提升竞争力和创新能力的重要课题。本文将从数据治理核心能力框架和数据治理体系规划两个方面进行探讨&#xff0c;以期为企业的数据治…

Controller中接收数组参数 post请求中在body中传+post请求中通过表单形式传(x-www-form-urlencoded)

1、场景 需要根据用户id集合批量删除用户数据&#xff0c;前端使用post请求&#xff0c;controller中参数接收数组参数并根据用户id删除用户基本信息 2、分析处理&#xff1a; 2.1、前端请求类型contentType:application/json 请求体中为json字符串&#xff0c;后端新建一个Us…

【GH】【EXCEL】bumblebee简介:GH↔EXCEL

文章目录 bumblebeeaddressComponentAnalysisAppCellChartingDataGraphicsRangeShapesWorkbooksWorksheets Sample: Accessing_ExcelExcel ApplicationWorkbookSave Workbook (Create)Get All Workbooks from AppGet Workbook by Name Get WorkbookGet Active Workbook from Ap…

python 阴暗图像 亮度增强 对比度增强 去雾

背景说明 最近在处理图像&#xff0c;发现一些样本由于逆光原因过于阴暗&#xff0c;影响图像识别。解决时&#xff0c;可以在训练样本中加入类似的图像&#xff0c;或者手动把相关图像进行颜色变化。这里主要介绍手工颜色变化。 原始图像如下&#xff0c;假设你需要判断裤子…

使用 Elasticsearch-DSL Python 客户端简化向量嵌入

作者&#xff1a;来自 Elastic Miguel Grinberg 在本文中&#xff0c;我们将介绍 Python 版 Elasticsearch-DSL 客户端&#xff0c;重点介绍它如何简化构建向量搜索解决方案的任务。 本文附带的代码实现了一个名言数据库。它包括一个使用 FastAPI Web 框架用 Python 编写的后端…

利用http获取文件升级

1.搭建模拟环境 1.电脑端开启Telnet客户端 2.下载HFS文件服务器 Download HFS_2024电脑最新版_HFS官方免费下载_华军软件园 (onlinedown.net) 将要升级的文件放到HFS文件系统中&#xff0c;这里我用了一个test.txt来作为实验 2.通过telnet敲http报文获取HFS服务器中的文件…

拼车系统功能案例分析

拼车系统功能案例分析可以从多个维度进行&#xff0c;以下是一个综合性的分析 一、用户注册与登录 功能描述&#xff1a;用户可以通过手机号、微信、QQ等多种方式轻松注册登录&#xff0c;并支持实名认证以增强身份真实性。案例分析&#xff1a;以T5出行拼车平台为例&#xff…

珂艾泰克拧紧控制器维修方法多样化

珂艾泰克拧紧控制器作为精密工业设备的关键组件&#xff0c;其稳定运行对于保证生产效率和产品质量至关重要。然而&#xff0c;在实际应用中&#xff0c;可能会因各种原因出现CORETEC拧紧控制器故障&#xff0c;影响生产线的正常运行。 【常见CORETEC拧紧控制器故障及原因分析】…

借助帕累托图减少设备停机时间:将非生产时间最小化

虽然全球通胀趋于稳定&#xff0c;但各行业仍能感受到2022年和2023年价格快速上涨的残余影响。对于石油和天然气公司来说&#xff0c;运营成本(包括设备、材料和劳动力)的上升加剧了财务压力。在这个竞争激烈的市场中&#xff0c;减少非生产时间(NPT)对于保持盈利能力至关重要。…

分享五种mfc140.dll丢失如何修复?五种修复错误的详细解决办法

在Windows操作系统中&#xff0c;DLL&#xff08;动态链接库&#xff09;文件扮演着至关重要的角色&#xff0c;它们为应用程序提供了共享的函数和资源。其中&#xff0c;mfc140.dll是Microsoft Visual C 2015 Redistributable Package的一部分&#xff0c;对于许多使用Microso…