ruoyi-vue版本(四)@PreAuthorize 注解在若依里面的作用,springsecurity 框架相关的配置

news2024/11/25 23:08:40

目录

  • 1 需求
  • 2 实现
    • 2.1 背景
    • 2.2 实现
    • 2.3 springsecurity 框架相关的配置
      • 2.3.1 @EnableGlobalMethodSecurity详解
      • 2.3.2 认证失败处理类AuthenticationEntryPointImpl
      • 2.3.3 自定义退出处理类LogoutSuccessHandlerImpl
      • 2.3.4 filter 为啥会多次执行
  • 3 @PreAuthorize 注解

1 需求

我们打开若依项目,发现一些接口上面是有@PreAuthorize 注解,那么这个注解的作用是什么?

2 实现

2.1 背景

我们点进去@PreAuthorize 注解 里面的源码,发现他是第三方的jar包里面的,在这里插入图片描述
我们都知道,若依项目是集成了 springsecurity 框架,所以这个注解直接使用的是这个 springsecurity 框架里面的,我们拿上这个注解使用就可以,那么他咋使用,底层逻辑是什么?

2.2 实现

既然若依项目是集成了 springsecurity 框架,那么肯定需要写springsecurity 的配置类,我们找一下

在这里插入图片描述
若依项目集成了很多的第三方的jar包,所以配置类是比较多,在这个ruoyi-framework 模块下,是有一个config文件夹,下面就是放的各种各样jar包的配置文件,我们找到和 springsecurity 框架相关的配置文件。

在这里插入图片描述

2.3 springsecurity 框架相关的配置

2.3.1 @EnableGlobalMethodSecurity详解

当我们想要开启spring方法级安全时,只需要在任何 @Configuration实例上使用 @EnableGlobalMethodSecurity 注解就能达到此目的。同时这个注解为我们提供了prePostEnabled 、securedEnabled 和 jsr250Enabled 三种不同的机制来实现同一种功能。

A. prePostEnabled = true:
会开启 @PreAuthorize@PostAuthorize 两个注解。

@PreAuthorize注解会在方法执行前进行验证,
支持Spring EL表达式;
@PostAuthorize 注解会在方法执行后进行验证,
不经常使用, 适用于验证带有返回值的权限。

Spring EL提供了returnObject,
用于能够在表达式语言中获取返回的对象信息;

B. securedEnabled = true:
会开启@Secured 注解,用来定义业务方法的安全配置,
在调用的接口或方法上使用该注解。

在需要安全控制(一般使用角色或者权限进行控制)的方法上指定
@Secured,达到只有具备那些角色/权限的用户才可以访问该方法。

指定角色时必须以ROLE_开头,不可省略;不支持Spring EL表达式;
如果想要使用@Secured注解指定"AND"条件,
即调用deleteAll方法需同时拥有ADMINDBA角色的用户时,
@Secured便不能实现,

只能使用@PreAuthorize/@PostAuthorize注解。

2.3.2 认证失败处理类AuthenticationEntryPointImpl

这个类是在spring security 配置类里面进行引用的,所以我们先看这个类里面干了什么事情

在这里插入图片描述
在这里插入图片描述
认证失败处理类AuthenticationEntryPointImpl 实现了AuthenticationEntryPoint接口,重写了这个接口的方法

在这里插入图片描述
它在用户请求处理过程中遇到认证异常时,被ExceptionTranslationFilter用于开启特定认证方案(authentication schema)的认证流程。

这里参数request是遇到了认证异常authException用户请求,response是将要返回给客户的相应,方法commence实现,也就是相应的认证方案逻辑会修改response并返回给用户引导用户进入认证流程。

也就是认证失败,就会自动的进方法commence方法里面,走里面的
逻辑;

修改response并返回给用户引导用户进入认证流程。这个是主要的
目的

2.3.3 自定义退出处理类LogoutSuccessHandlerImpl

这个类实现了LogoutSuccessHandler接口,重写了里面的onLogoutSuccess方法,并且这个类上面是@Configuration;
说明当前类是全局配置类;

LogoutSuccessHandler接口是Spring Security框架里面的

为什么要实现这个接口?

大多数业务场景下,自定义登出成功页面也满足不了一些要求,
更别提默认的登出成功页面。这时候,就需要别的方案支持
,幸运的是,Spring Security 框架还真就非常贴心的提供了
这样一个接口 LogoutSuccessHandler, 专门用于处理用户
登出成功请求。当然了,对于 LogoutSuccessHandler 接口,
Spring Security 框架有一些默认的实现,也可以自行扩展。


同用户登录成功的业务场景,在用户登出成功后,我们也要通过邮件、
短信、微信,来通知用户,在什么时间,什么地点,退出了系统。
更甚至,可以通知用户本次登录都操作了那些功能,做了哪些操作
等等。同时,也要把这些信息记录在日志文件中。而这所有的需求,
都可以通过实现 LogoutSuccessHandler 接口来实现。


扩展 LogoutSuccessHandler 接口实现发送信息、日志记录。

@Override
public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException {
    super.onLogoutSuccess(request, response, authentication);this.logger.info(String.format("IP %s,用户 %s, 于 %s 退出系统。", request.getRemoteHost(), authentication.getName(), LocalDateTime.now()));try {
        // 发邮件
        this.emailService.send();// 发短信
        this.smsService.send();// 发微信
        this.weChatService.send();
    } catch (Exception ex) {
        this.logger.error(ex.getMessage(), ex);
    }
}

目前若依项目,当退出的时候,所做的事情是在redis里面清空token,之后异步记录一下日志;

package com.ruoyi.framework.security.handle;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.core.Authentication;
import org.springframework.security.web.authentication.logout.LogoutSuccessHandler;
import com.alibaba.fastjson2.JSON;
import com.ruoyi.common.constant.Constants;
import com.ruoyi.common.constant.HttpStatus;
import com.ruoyi.common.core.domain.AjaxResult;
import com.ruoyi.common.core.domain.model.LoginUser;
import com.ruoyi.common.utils.ServletUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.framework.manager.AsyncManager;
import com.ruoyi.framework.manager.factory.AsyncFactory;
import com.ruoyi.framework.web.service.TokenService;

/**
 * 自定义退出处理类 返回成功
 * 也就是用户退出系统,在退出之前会默认做的事情
 * @author jing
 */
@Configuration
public class LogoutSuccessHandlerImpl implements LogoutSuccessHandler
{
//    将token的工具类 引入
    @Autowired
    private TokenService tokenService;

    /**
     * 退出处理
     * 
     * @return
     */
    @Override
    public void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response, Authentication authentication)
            throws IOException, ServletException
    {
//        根据request  获取到用户的信息
        LoginUser loginUser = tokenService.getLoginUser(request);
        if (StringUtils.isNotNull(loginUser))
        {
            String userName = loginUser.getUsername();
            // 删除用户缓存记录    redis  里面进行删除
            tokenService.delLoginUser(loginUser.getToken());
            // 记录用户退出日志
            AsyncManager.me().execute(AsyncFactory.recordLogininfor(userName, Constants.LOGOUT, "退出成功"));
        }

//        直接渲染信息到客户端
        ServletUtils.renderString(response, JSON.toJSONString(AjaxResult.error(HttpStatus.SUCCESS, "退出成功")));
    }
}

2.3.4 filter 为啥会多次执行

在servlet2.3中,Filter会经过一切请求,包括服务器内部使用的forward转发请求和<%@ include file=”/login.jsp”%>的情况

servlet2.4中的Filter默认情况下只过滤外部提交的请求,forward和include这些内部转发都不会被过滤

 就是有可能一个接口里面,使用了forward和include这些内部转发;
 然后继续  执行过滤器

3 @PreAuthorize 注解

通过在PreAuthorize表达式的Bean名称开头添加@来引用注册为组件的Bean。

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

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

相关文章

Flink面试题汇总

1&#xff0c;简单介绍一下 Flink Flink 是一个框架和分布式处理引擎&#xff0c;用于对无界和有界数据流进行有状态计算。并且 Flink 提供了数据分布、容错机制以及资源管理等核心功能。Flink提供了诸多高抽象层的API以便用户编写分布式任务&#xff1a; DataSet API&#xf…

nacos多网卡服务器引发的问题

1、背景 某一日晚上&#xff0c;公司的一个微服务上线重启后&#xff0c;双节点&#xff0c;只有一个节点注册到了nacos服务器&#xff0c;另外一个节点一直在nacos界面上无法看到&#xff0c;两个节点的服务启动也没有报错&#xff0c;api网关转发给服务时&#xff0c;时不时有…

深度学习入门基础——卷积计算

卷积计算 卷积是数学分析中的一种积分变换的方法&#xff0c;在图像处理中采用的是卷积的离散形式。这里需要说明的是&#xff0c;在卷积神经网络中&#xff0c;卷积层的实现方式实际上是数学中定义的互相关 &#xff08;cross-correlation&#xff09;运算&#xff0c;与数学…

【进阶】数据在内存中的存储

目录 一、数据类型介绍 1、基本的内置类型 2、类型的基本归类 二、整型在内存中的存储 1、原码、反码、补码 2、大小端介绍 3、大端小端的经典例题 三、浮点数在内存中的存储 1、浮点数存储规则 2、浮点数存储例题 一、数据类型介绍 1、基本的内置类型 char /…

非标设备制造业项目管理软件如何帮助企业做好项目报价管理?

非标设备制造企业&#xff0c;由于需求的不确定性、方案的多样性、交期的紧迫性、以及批量小&#xff08;很多需要先做单台样机&#xff09;等特性&#xff0c;导致非标设备要在有限时间内做到准确报价存在一定的困难&#xff0c;这也是众多非标设备制造企业亟待解决的问题。报…

MySQL Shell 逻辑备份恢复API

MySQL8.0开始提供的MySQL Shell功能&#xff0c;是DBA推向了另一个高度&#xff0c;除SQL外&#xff0c;正式踏入Cloud数据库服务 和 shell操作数据库领域&#xff08;MGR是一个代表点&#xff09;。 日常DBA工作可以通过MySQL Shell更容易实现。因为MySQL Shell处理用JavaScr…

3、Ubuntu20Server安装远程连接

Ubuntu20Server安装 安装虚拟机virtualbox VMware Workstation Pro 下载Ubuntu安装光驱Get Ubuntu | Download | Ubuntu 都下载完毕准备安装驱动 配置信息 这里用的是Ubuntu Server 一路Done或回车过三关斩六将来到这里 安装到这里,需要修改镜像站点地址,修改为国内的163网易…

Linux文件系统及磁盘命名

✅作者简介&#xff1a;热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏&#xff1a;Java案例分…

Golang 调整视频fps和分辨率 | Golang工具

目录 前言 环境依赖 代码 总结 前言 本文提供将视频修改fps和分辨率的工具方法&#xff0c;一如既往的实用主义。 主要也是学习一下golang使用ffmpeg工具的方式。 环境依赖 ffmpeg环境安装&#xff0c;可以参考我的另一篇文章&#xff1a;windows ffmpeg安装部署_阿良的博…

Vector - VT System - 模拟IO板卡_VT2816

前面介绍了模拟量的输入板卡VT2004&#xff0c;今天我们介绍的这个板卡依然是模拟量的输入&#xff0c;具体使用场景可能要我们根据实际的使用场景去进行选择。VT2004更偏向于激励&#xff0c;而VT2816更偏向于通用模拟量的IO使用&#xff0c;下面我们从功能、参数、硬件结构等…

SpringBoot接入JaCoCo实践代码覆盖率

这里写自定义目录标题参考概述接入静态接入和动态接入参考 SpringBoot接入JaCoCo实践 概述 JaCoCo是面向Java的开源代码覆盖率工具&#xff0c;JaCoCo以Java代理模式运行&#xff0c;它负责在运行测试时检测字节码。 JaCoCo会深入研究每个指令&#xff0c;并显示每个测试过程…

【uniapp】关于webview组件无法自定义宽高问题解决

最近做的项目中&#xff0c;在h5环境运行上遇到关于webview组件无法自定义宽高问题&#xff0c;要怎么弄才好呢&#xff0c;其实没那么难&#xff0c;很简单的&#xff0c;现在将解决方法讲一下。 使用例子 默认是全屏加载的&#xff0c;现在需要内嵌一个webview组件放在限定…

10款最佳在线地图软件介绍

有人说&#xff1a;一个人从1岁活到80岁很平凡&#xff0c;但如果从80岁倒着活&#xff0c;那么一半以上的人都可能不凡。 生活没有捷径&#xff0c;我们踩过的坑都成为了生活的经验&#xff0c;这些经验越早知道&#xff0c;你要走的弯路就会越少。 在线地图有无数的用途&…

3D模型轻量化处理教程【Blender】

在本文中&#xff0c;我们将介绍三种在 Blender 中网格轻量化的方法&#xff0c;并以一些提示和技巧作为结尾&#xff0c;供你在处理网格和对象时使用。 1、网格轻量化概述 无论你是想创建简单还是复杂的 3D 设计&#xff0c;Blender 都是拟工具箱中的一个很棒的程序。 它是…

Nessus 高级扫描

系列文章 Nessus介绍与安装 Nessus Host Discovery Nessus高级扫描 1.启动nessus cd nessus sh qd_nessus.sh2.进入nessus网站&#xff0c;点击【new Scan】 https://kaliip:8834/3.选择【adVanced Scan】 4.输入Name【高级扫描】&#xff0c;Description【高级扫描】&…

深度学习基础——填充(padding)与步幅(stride)

填充&#xff08;padding&#xff09; 在上图中&#xff0c;输入图片尺寸为333\times333&#xff0c;输出图片尺寸为222\times222&#xff0c;经过一次卷积之后&#xff0c;图片尺寸为222\times222&#xff0c;经过一次卷积之后&#xff0c;图片尺寸变小。卷积输出特征图的尺寸…

SQLServer 2016 备份

1、下载并安装SQLServer2016服务器端&#xff0c; 下载地址&#xff1a;https://www.microsoft.com/zh-cn/evalcenter/download-sql-server-2016 2、下载并安装SSMS管理工具&#xff0c; 下载地址&#xff1a;https://download.microsoft.com/download/8/a/8/8a8073d2-2e00-…

渗透学习-CTF篇-web-BUUCTF

文章目录前言一、[WesternCTF2018]shrine前言 随着学习的不断深入&#xff0c;为了防止自己忘记之前所学的内容&#xff0c;于是我决定再不断的向下学习的同时做一些ctf的题来唤醒自己的记忆&#xff01;&#xff01; 一、[WesternCTF2018]shrine 这一关主要是SSTI的内容&…

Docker安装部署sql审计平台Archery1.9.1版本

安装dockercurl -fsSL https://get.docker.com -o get-docker.sh | sudo sh安装docker composesudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod x…

chrono_Time_point (三)

chrono_time_point (三&#xff09; 文章目录chrono_time_point (三&#xff09;模板参数源码解析构造函数&#xff1a;成员函数time_since_epoch()例子timepoint提供的操作timepoint的溢出C和POSIX提供的Date/Time函数演示案例&#xff08;timepoint和日历时间的转换&#xff…