在springsecurity中,往往需要对部分接口白名单访问,而大部分在使用security中就有一个误区,那就是免鉴权访问和白名单的区别。
大部分的security文章包括官方文档给出免鉴权访问都是使用.permitall()去对相应路径进行免鉴权访问,但实际上这仅仅只表示该资源不需要相应的权限访问,但是用户还需要认证.也就是security的认证/授权两个概念.
security白名单策略
将需要放行的白名单使用.ignoring注册.
@bean public websecuritycustomizer ignoringcustomizer() { return web -> web.ignoring().requestmatchers(whiteurlarr); }
当spring启动后,会将其中每个url注册为一个mvcrequestmatcher并且放入到websecurity中的ignoredrequests管理。
然后在构建websecurity时去创建对应的defaultsecurityfilterchain.
然后这些会被放入到security的过滤链中交给websecurity进行管理,当有请求进入后就会进入到过滤链时,websecurity会去循环调用chian,以获取处理请求路径对应的过滤器组成过滤链,如果未注册ignor则会使用默认的anyrequest,这将返回全部的security过滤器.
private list<filter> getfilters(httpservletrequest request) { int count = 0; iterator var3 = this.filterchains.iterator(); securityfilterchain chain; do { if (!var3.hasnext()) { return null; } chain = (securityfilterchain)var3.next(); if (logger.istraceenabled()) { ++count; logger.trace(logmessage.format("trying to match request against %s (%d/%d)", chain, count, this.filterchains.size())); } } while(!chain.matches(request)); return chain.getfilters(); }
而defaultsecuritychain则会使用其对应的match对请求路径进行匹配,如果匹配上则返回相应的过滤器.
匹配成功返回requestmatchresult:
通过返回的对象是否为空进行判断是否匹配成功:
匹配成功后会返回其对应的filter,因为是通过igonr去进行忽略的所以filter为空,所以就会忽略对对应路径请求的鉴权等操作.
这就是springsecurity真正的白名单,而不仅仅是对相应路径进行免权访问.
后续会尝试去探索免权访问...
到此这篇关于springsecurity如何正确的设置白名单的文章就介绍到这了,更多相关springsecurity白名单内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论