Security的入门和流程分析

Security的入门和流程分析

问题:访问一个controller方法之前进行一个权限验证?

在controller里面的每一个handler无论什么访问都要进行一个校验,但是对于login logout 验证码这种Handler处理器是放行的

1.使用过滤器+拦截器 注意两者区别

过滤器(Filter)和拦截器(Interceptor)都是用于处理请求和响应的组件,它们的区别主要在于它们作用的层次和执行时机。

  1. 过滤器(Filter):

    • 作用层次:在Servlet规范中,过滤器是在Web服务器和Web应用程序之间的层次上工作的,主要用于处理HTTP请求和响应。
    • 执行时机:在请求的进入和响应的离开阶段都可以执行过滤操作。
  2. 拦截器(Interceptor):

    • 作用层次:拦截器通常在应用程序框架层次上工作,例如在Spring框架中。它们用于拦截和处理方法调用、请求处理等。
    • 执行时机:在方法调用前后、请求处理前后等关键点上执行,更加细粒度地控制请求的处理过程。

创建一个过滤器类,实现 javax.servlet.Filter 接口。在 doFilter 方法中添加权限验证的逻辑。

public class MyFilter implements Filter {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {// 过滤器权限验证逻辑// 如果是登录、登出、验证码等处理器,放行// 否则进行权限验证chain.doFilter(request, response); // 继续请求链
}
​
// 其他 Filter 接口方法,如 init 和 destroy,可以留空
}
​SpringMvc流程:(本质用来处理用户的请求并进行·处理)

加一个校验  (假设执行所有方法之前)

拦截器在方法执行之前执行

过滤器只要访问了我的web容器就执行

Spring MVC的简要流程如下:

  1. 请求到达DispatcherServlet: 所有的请求首先由前端控制器 DispatcherServlet 接收。

  2. Handler Mapping: DispatcherServlet 通过 HandlerMapping 查找请求对应的处理器(Controller)。        IOC/AOP ->Spring

  3. Handler Execution: 找到合适的处理器后,执行相应的方法。

  4. ModelAndView: 处理器返回一个 ModelAndView 对象,其中包含模型数据和视图名称。

  5. View Resolver: DispatcherServlet 通过 ViewResolver 解析视图名称,获取视图对象。

  6. View Rendering: 视图对象负责渲染模型数据,生成最终的响应结果。

  7. 返回响应: DispatcherServlet 将最终的响应发送给客户端。

2. 创建拦截器

创建一个拦截器类,实现 Spring 的 HandlerInterceptor 接口。在 preHandle 方法中添加权限验证的逻辑。

public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {// 拦截器权限验证逻辑// 如果是登录、登出、验证码等处理器,放行// 否则进行权限验证,返回 true 表示继续执行,返回 false 表示拦截请求return true;
}
​
// 其他 HandlerInterceptor 接口方法,可以留空
}
​

3. 配置过滤器和拦截器

在你的应用程序配置中,配置过滤器和拦截器,并指定它们的拦截/过滤路径以及放行路径

@Configuration
public class AppConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
​
@Bean
public FilterRegistrationBean<MyFilter> myFilter() {FilterRegistrationBean<MyFilter> registrationBean = new FilterRegistrationBean<>();registrationBean.setFilter(new MyFilter());registrationBean.addUrlPatterns("/secure/*"); // 设置过滤路径return registrationBean;
}
​
@Override
public void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor).addPathPatterns("/secure/**") // 设置拦截路径.excludePathPatterns("/login", "/logout", "/captchaImage"); // 设置放行路径
}
}

方法一:过滤器做放行(/login)  拦截器做校验判断

方法二:   使用springsecurity(优化之前的方式)  -> 专门用于处理认证和授权

第一步配置:

?No Ideal 

这个Spring整合SpringSecurity的案例解释一下

这两个方法的的调用还是不理解 为啥我就不用手动调用了

1.系统启动的时候Springsecurity做了什么事情?
在Spring的初始化中完成了对SpringSecurity的配置文件的加载解析操作。

Springboot的执行流程:

1.new一个SpringApplication  2.RUN  分两部分

过滤器:看过滤方法就行 init()  doFilter()  destory()

:IOC容器

SpringSecurity必须依赖Spring

有请求:开始过滤dofilter()   最终去web容器找过滤器

DelegatingFilterproxy在初始化的时候,从容器中根据名称和类型从IOC容器中取到了FiterChainProxy对象,该对象肯定是在SpringSecurity的初始化操作时创建的

SpringSecurity在初始化的时候->根据我们这个配置代理过滤器名称  从IOC容器中拿到DelegatingFilterproxy对象

走完init->走doFilter

NO ideal??

代理过滤器 从IOC容器里面获取FilterChainProxy->在过滤器里面帮你初始化一组过滤器链然后真正处理请求走过滤器链 认证走拦截器

demo

/

整个流程:

必须加密   ->把东西加到IOC容器当中这是需要的

Bad credentials

test1

1234

No Ideal??

LoginUrlAuthenticationEntryPoint的commence方法:方法的执行时机???

登录controller:

登录实现类Impl:

写完一个功能 merge到主线

从controller --> 到...ByLoadNameAndPassword()方法

@Componnets不可以搞源码哦

注入问题:

read-only不能加@Bean标签

方法二:

注入成功之后:

传Authentication接口的子类的实现类

登出实现类Impl:

认证流程

用户详情实现类:

账号密码 --> 存入ThreadLocal中

获取user对象(通过工具类)

String username = AuthenticationContextHolder.getContext().getName();//拿到用户名

String password= AuthenticationContextHolder.getContext().getPassword();//拿到密码

JsonIgnore:序列化操作忽略Security的入门和流程分析

swagger:接口规范的api有关 -> controller中的RquestMapping("url")

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

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

相关文章

DataGrip 数据库备份

一、备份 1、找到需要被备份的数据库demo&#xff0c;右键>Import/Export>Export with mysqldump 2、配置路径 点击run&#xff0c;等待完成 导出成功 二、还原 选择 需要导入的数据库>右键>Import/Export>Restore with ‘mysql’ 点击run&#xff0c;刷…

基于seatunnel实现mysql同步clickhouse验证

场景&#xff1a; 需求想要实现mysql同步到clickhouse&#xff0c;seatunnel部署见前面文档linux环境seatunnel安装运行-CSDN博客。 官方说明文档 Clickhouse | Apache SeaTunnel mysql同步配置 server-id1 log_bin/var/lib/mysql/bin.log binlog_formatROW #binlog-do-db 具…

为什么说上了金蝶、用友系统后,下一步是部署BI?

经常有些不熟悉BI工具的用户问我&#xff1a;金蝶、用友系统和BI工具与什么区别&#xff0c;为什么说上了金蝶、用友系统后&#xff0c;下一步就是部署BI&#xff1f;这两个系统工具的功能不重叠吗&#xff1f; 首先&#xff0c;要了解金蝶、用友系统和BI工具的各自作用。 金…

理解 Node.js 中的事件循环

你已经使用 Node.js 一段时间了&#xff0c;构建了一些应用程序&#xff0c;尝试了不同的模块&#xff0c;甚至对异步编程感到很舒适。但是有些事情一直在困扰着你——事件循环&#xff08;Event Loop&#xff09;。 如果你像我一样&#xff0c;花费了无数个小时阅读文档和观看…

虚幻UE 增强输入-触发器

上一篇增强输入基础&#xff1a;虚幻UE 增强输入-第三人称模板增强输入分析与扩展 主要对第三人称模板的增强输入进行分析、复刻和扩展 本篇将会对增强输入中的触发器中的各参数进行讲解 文章目录 前言触发器参数1、下移TriggerDown2、已按下TriggerPressed3、已松开TriggerRel…

开启远程工作之旅

远程工作绝对是未来的趋势。 不管是全职还是兼职&#xff0c;远程办公更加提供了更加自由的工作环境&#xff0c;再好的办公环境有家里舒服吗&#x1f436;&#xff1f; 而现在所有远程办公的平台&#xff0c;目前对新手最友好的&#xff0c;我个人觉得是云队友平台。 不仅提供…

cesium粒子爆炸效果

效果&#xff1a; //添加爆炸模型window.swpecesium.addEntity.addModel({id: "model",position: {lon: 116.34516786934411,lat: 39.99753297677145,},config: {url: "./model/baozha/scene.gltf",minSize: 200,maxSize: 300,},});var scene viewer.scen…

接口测试测什么?一个简单问题把我难住了!

那么设计测试用例时我们主要考虑如下几个方面&#xff1a; 01、功能测试 接口的功能是否正确实现了 接口是否按照设计文档中来实现 &#xff08;比如username参数写为了user&#xff0c;那么这就不符合&#xff0c;因为接口文档在整个开发中都需要使用&#xff0c;所以接口实…

60V降12V3A降压芯片WT6037

60V降12V3A降压芯片WT6037 WT6037是一款高压同步降压转换器&#xff0c;可在10V到90V的宽输入电压范围内工作适用于宽电压输入12V-72V电池组系统降压和60V-90V降压应用。WT6037可提供4A连续负载电流&#xff0c;转换效达92%。 WT6037采用具有内置补偿的固定频率峰值电流控…

Element ui 改变el-transfer 穿梭框的大小

修改el-transfer 左右两个穿梭框的高度和宽度&#xff0c;具体效果如下正常大小的穿梭框修改之后的&#xff0c;主要在style中加上如下样式即可 /deep/ .el-transfer-panel{ width: 470px; /* 左右两个穿梭框的高度和宽度 */ height: 450px; } /deep/ .el-transfer-panel__li…

element的Table表格组件树形数据与非懒加载

1.代码实现 <template><div><el-row :gutter"10" class"mb8"><el-col :span"1.5"><el-button type"info" plain icon"el-icon-sort" size"mini" click"toggleExpandAll"&g…

Java面试题之集合篇

前言 本篇主要总结JAVA面试中关于集合相关的高频面试题。本篇的面试题基于网络整理以及自己的总结编辑。在不断的完善补充哦。欢迎小伙伴们在评论区发表留言哦&#xff01; 1、基础 1.1、Java 集合框架有哪些&#xff1f; Java 集合框架&#xff0c;大家可以看看 《Java 集…

[运维|gitlab] docker Gitlab 命令行后台修改密码

参考文献 docker Gitlab 初始化账号以及密码是什么呢 修改密码 进入容器 docker exec -it gitlab bash进入bin目录 进入gitlab的bin目录 cd /opt/gitlab/bin执行命令 执行gitlab-rails console gitlab-rails console执行命令 找到root的用户&#xff0c;输入uUser.where…

【每日面试题】Docker常见面试题精选

什么是Docker容器&#xff1f; Docker容器是一种轻量级的虚拟化技术&#xff0c;可以将应用及其依赖项打包在一个可移植的容器中&#xff0c;以便在多个环境中运行。 Docker镜像和容器之间有什么区别&#xff1f; Docker镜像是一个包含了应用程序及其依赖项的只读模板&#xf…

C#上位机与欧姆龙PLC的通信10----开发专用的通讯工具软件(WPF版)

1、介绍 上节开发了一个winform版的通讯测试工具&#xff0c;这节再搞个wpf版的&#xff0c;wpf是什么&#xff1f;请自行百度&#xff0c;也可以看前面的博客&#xff0c;WPF真入门教程&#xff0c;wpf的界面效果是比winform漂亮&#xff0c;因为wpf使用了web项目中的css样式…

java发送邮件到qq邮箱

自己的授权码自己记好 引入依赖 <dependency><groupId>com.sun.mail</groupId><artifactId>javax.mail</artifactId><version>1.6.2</version> </dependency> <dependency><groupId>javax.mail</groupId>&…

Socket与TCP的关系

前言 相信大家对于TCP已经非常熟悉了&#xff0c;学习过计算机网络的同学对于它的连接和断开流程应该已经烂熟于心了吧。 那么Socket是什么&#xff1f; Socket是应用层与TCP/IP协议簇通信的中间软件抽象层&#xff0c;它是一组接口。在设计模式中&#xff0c;Socket其实就是…

车位关键点检测-车位识别-车辆识别检测(教程+代码)

车位关键点检测、车位识别和车辆识别检测是现代智能交通系统中的重要技术&#xff0c;它们在提高停车管理效率和交通流畅度方面起着重要作用。以下是对这三个技术的分点阐述&#xff1a; 1. 车位关键点检测&#xff1a; 车位关键点检测是指通过计算机视觉技术&#xff0c;自动…

Docker中镜像的相关操作

1.辅助操作 docker version&#xff1a;用查看docker客户端引擎和server端引擎版本信息。 docker info&#xff1a;用来查看docker引擎的详细信息。 docker --help&#xff1a;用来查看帮助信息。 2.镜像Image docker images&#xff1a;查看当前本地仓库中存在哪些镜像。 …

解决uniapp打包成apk后uni.getStorageSync获取不到值

uniapp写的项目&#xff0c;在hbuilderx中云打包成apk后我在登录存储的token死都获取不到&#xff0c;导致后续接口请求头没有token连接不到接口&#xff0c;只有运行到手机或者模拟器还有打包成apk后是获取不到&#xff0c;其他的小程序还有网页都可以获取到 试过了很多种方法…