Spring Security--多个过滤器链和多个用户表

news/2024/11/30 9:38:57/

 请求从客户端出发,到达客户端,也就是servlet,中间有很多过滤器的,其中就有一个过滤器链代理,里面包含了过滤器的一个集合。而且Spring Security Filter并不是直接嵌入到Web Filter中的,而是通过FilterChainProxy 来统一管理 Spring Security Filter, FilterChainProxy 本身则通过 Spring提供的 DelegatingFilterProxy代理过滤器嵌入到Web Filter之中。

 可以看到,当请求到达FilterChainProxy之后,FilterChainProxy 会根据请求的路径,将请求转发到不同的Spring Security Filters 上面去,不同的Spring Security Filters 对应了不同的过滤器,也就是不同的请求将经过不同的过滤器。

对项目进行简单的改造

 如果访问/web/hello这个路径,Security处理器执行链中将不包含SessionManagementFilter

如果访问/v1/hello这个路径,Security处理器执行链中包含SessionManagementFilter

也就是一组对照实验,我们后面再配置两条过滤器链,分别区分这两个接口,看看两条链是否都生效,第一个接口是可以开启多个会话的,第二个是不允许的。

 @BeanSecurityFilterChain securityFilterChain1(HttpSecurity httpSecurity)  throws Exception{httpSecurity.antMatcher("/web/**").authorizeRequests().anyRequest().authenticated().and().formLogin()//配置处理登录请求的接口,其实就是配置了过滤器里的拦截规则,将来的登录请求就会在过滤器中被处理.loginProcessingUrl("/web/login")//配置登录表单中用户名的 key.usernameParameter("username")//配置登录表单中的密码 默认也是username 和 password.passwordParameter("password").successHandler((request, response, authentication) -> {response.setContentType("application/json;charset=utf-8");ResBean resBean = ResBean.ok("登陆成功web");String s = new ObjectMapper().writeValueAsString(resBean);response.getWriter().write(s);}).and().sessionManagement()//设置会话的最大并发数.maximumSessions(1)//达到最大登录数后,是否要阻止下一个登录.maxSessionsPreventsLogin(true)//关闭默认的csrf认证.and().and().csrf().disable();return httpSecurity.build();}@BeanSecurityFilterChain securityFilterChain2(HttpSecurity httpSecurity)  throws Exception{httpSecurity.antMatcher("/v1/**").authorizeRequests().anyRequest().authenticated().and()//开始配置登录表单.formLogin()//配置登录页面,如果访问了一个需要登录以后才能访问的页面,那么就会自动登录到这个页面.loginPage("/login.html")//配置处理登录请求的接口,其实就是配置了过滤器里的拦截规则,将来的登录请求就会在过滤器中被处理.loginProcessingUrl("/v1/login")//配置登录表单中用户名的 key.usernameParameter("username")//配置登录表单中的密码 默认也是username 和 password.passwordParameter("password")//配置登录成功后访问的接口.successHandler((request, response, authentication) -> {response.setContentType("application/json;charset=utf-8");ResBean resBean = ResBean.ok("登陆成功v1");String s = new ObjectMapper().writeValueAsString(resBean);response.getWriter().write(s);}).and().sessionManagement().disable()//关闭默认的csrf认证.csrf().disable();return httpSecurity.build();}

 红框里的就是已经添加的过滤器链,感兴趣的可以自己在记事本打开看看。

注意的是,规则一定要统一,一条执行链的规则,如/web/**,下面一切的接口都加/web/**,包括登录的接口

 

 我们再去浏览器登一下看看效果,/web的是设置了最大会话数的,v1的没有设置

 报错了

第二个请求肯定是成功的,这里留给大家自己尝试。

再就是多用户了,security也是支持的,也就是有多个UserService

 可以是UserService1,UserService2

然后分别注入不同的过滤器执行链中,如下

 上图,我直接在内存中写了个用户,模拟不同表的用户,下面是数据库的用户登录。

 效果就是对应的UserService只能登上对应的过滤器链。

也就是lisi这个账号只能上/v1,admin只能上/web

想看效果的同学可以再复制一个UserService2出来,

 

 这样就能看出效果了,

admin这个账号就哪也登不上了,

zhangsan只能登/web这条链,

lisi也只能登/v1这条链

 

 上图回到了登录页,说明登录失败。

 总结一下,当出现多个userService时,过滤器执行链选择了哪个,就只会用那一个userService。另外。

 希望大家看完能有所收获。最后贴个demo代码吧security_demo: 一个简单详细的security的学习项目


http://www.ppmy.cn/news/382084.html

相关文章

方太也造车?

听说方太也造车了? 造车闹剧层出不穷 近年来,随着智能汽车概念的风行,各大品牌也掀起了一股造车的热潮。一时间,互联网、房地产、家电、手机……各行各业的企业都纷纷粉墨登场,各种造车闹剧层出不穷。 然而很快人们就发…

尚硅谷大数据技术Spark教程-笔记09【SparkStreaming(概念、入门、DStream入门、案例实操、总结)】

尚硅谷大数据技术-教程-学习路线-笔记汇总表【课程资料下载】视频地址:尚硅谷大数据Spark教程从入门到精通_哔哩哔哩_bilibili 尚硅谷大数据技术Spark教程-笔记01【SparkCore(概述、快速上手、运行环境、运行架构)】尚硅谷大数据技术Spark教程…

【Flutter】Flutter 如何切换页面

文章目录 一、简介二、Navigator 的使用三、实际示例:电影应用的页面切换四、完整代码五、 总结 一、简介 什么是页面切换呢?简单来说,页面切换就是在应用的不同界面之间进行跳转。例如,在一个电影应用中,从电影列表页…

安装Office365后版本信息显示为Office2016

尝试winS输入CMD,以管理员身份运行后,使用下面的命令: cd C:\Program Files\Microsoft Office\Office16 (如果是32位,路径为Program Files(x86)) cscript ospp.vbs /dstatus 查看…

2023-03-27-安装office365显示Microsoft Office 专业增强版 2016

解决办法: 以管理员方式打开命令提示符、 快捷键:winq cd C:\Program Files\Microsoft Office\Office16 cscript ospp.vbs /dstatus cscript ospp.vbs /unpkey:WFG99 cscript ospp.vbs /dstatus卸载完成后,重新打开office,登录账…

安装Office365后版本信息显示为Office2019或者其他的解决方案

管理员身份运行winR ,输入CMD 在黑窗口输入下面的命令 cd C:\Program Files\Microsoft Office\Office16cscript ospp.vbs /dstatus查看返回的信息,看下有没有你以前版本的型号 ,如果有(last行最后五位),记下其提供的最后5位秘钥…

Office2021版安装出错

1.问题简介 今天想安装office2021版,于是通过控制面板卸载了office老版本,但是安装新版本却会出现报错,提示有旧版本没有删除,无法安装。 2.解决办法 (1)知乎给的解决办法 当时就百度了知乎——《如何解…

Office2016 64位安装包+只安装3件套

最近重装了系统,本想用wps代替的,最后屁颠屁颠地来安装Office。 来bb下wps,禁不掉的“wpscenter.exe”进程,广告时不时来问候,wps表格中hyperlink公式有bug,常见的链接看到的是一个链接打开的是另一个链接…