安庆大理运城常德铜陵江西
投稿投诉
江西南阳
嘉兴昆明
铜陵滨州
广东西昌
常德梅州
兰州阳江
运城金华
广西萍乡
大理重庆
诸暨泉州
安庆南充
武汉辽宁

别再用过时的方式了!全新版本SpringSecurity,这

11月3日 龙凤殿投稿
  前不久SpringBoot2。7。0刚刚发布,SpringSecurity也升级到了5。7。1。升级后发现,原来一直在用的SpringSecurity配置方法,居然已经被弃用了。不禁感慨技术更新真快,用着用着就被弃用了!今天带大家体验下SpringSecurity的最新用法,看看是不是够优雅!基本使用
  我们先对比下SpringSecurity提供的基本功能登录认证,来看看新版用法是不是更好。升级版本
  首先修改项目的pom。xml文件,把SpringBoot版本升级至2。7。0版本。parentgroupIdorg。springframework。bootgroupIdspringbootstarterparentartifactIdversion2。7。0versionrelativePath!lookupparentfromrepositoryparent旧用法
  在SpringBoot2。7。0之前的版本中,我们需要写个配置类继承WebSecurityConfigurerAdapter,然后重写Adapter中的三个方法进行配置;SpringSecurity的配置Createdbymacroon2018426。ConfigurationEnableWebSecurityEnableGlobalMethodSecurity(prePostEnabledtrue)publicclassOldSecurityConfigextendsWebSecurityConfigurerAdapter{AutowiredprivateUmsAdminServiceadminSOverrideprotectedvoidconfigure(HttpSecurityhttpSecurity)throwsException{省略HttpSecurity的配置}Overrideprotectedvoidconfigure(AuthenticationManagerBuilderauth)throwsException{auth。userDetailsService(userDetailsService())。passwordEncoder(passwordEncoder());}BeanOverridepublicAuthenticationManagerauthenticationManagerBean()throwsException{returnsuper。authenticationManagerBean();}}
  如果你在SpringBoot2。7。0版本中进行使用的话,你就会发现WebSecurityConfigurerAdapter已经被弃用了,看样子SpringSecurity要坚决放弃这种用法了!
  新用法
  新用法非常简单,无需再继承WebSecurityConfigurerAdapter,只需直接声明配置类,再配置一个生成SecurityFilterChainBean的方法,把原来的HttpSecurity配置移动到该方法中即可。SpringSecurity5。4。x以上新用法配置为避免循环依赖,仅用于配置HttpSecurityCreatedbymacroon2022519。ConfigurationpublicclassSecurityConfig{BeanSecurityFilterChainfilterChain(HttpSecurityhttpSecurity)throwsException{省略HttpSecurity的配置returnhttpSecurity。build();}}
  新用法感觉非常简洁干脆,避免了继承WebSecurityConfigurerAdapter并重写方法的操作,强烈建议大家更新一波!高级使用
  升级SpringBoot2。7。0版本后,SpringSecurity对于配置方法有了大的更改,那么其他使用有没有影响呢?其实是没啥影响的,这里再聊聊如何使用SpringSecurity实现动态权限控制!基于方法的动态权限
  首先来聊聊基于方法的动态权限控制,这种方式虽然实现简单,但却有一定的弊端。在配置类上使用EnableGlobalMethodSecurity来开启它;SpringSecurity的配置Createdbymacroon2018426。ConfigurationEnableWebSecurityEnableGlobalMethodSecurity(prePostEnabledtrue)publicclassOldSecurityConfigextendsWebSecurityConfigurerAdapter{}然后在方法中使用PreAuthorize配置访问接口需要的权限;商品管理ControllerCreatedbymacroon2018426。ControllerApi(tagsPmsProductController,description商品管理)RequestMapping(product)publicclassPmsProductController{AutowiredprivatePmsProductServiceproductSApiOperation(创建商品)RequestMapping(valuecreate,methodRequestMethod。POST)ResponseBodyPreAuthorize(hasAuthority(pms:product:create))publicCommonResultcreate(RequestBodyPmsProductParamproductParam,BindingResultbindingResult){intcountproductService。create(productParam);if(count0){returnCommonResult。success(count);}else{returnCommonResult。failed();}}}再从数据库中查询出用户所拥有的权限值设置到UserDetails对象中去,这种做法虽然实现方便,但是把权限值写死在了方法上,并不是一种优雅的做法。UmsAdminService实现类Createdbymacroon2018426。ServicepublicclassUmsAdminServiceImplimplementsUmsAdminService{OverridepublicUserDetailsloadUserByUsername(Stringusername){获取用户信息UmsAdminadmingetAdminByUsername(username);if(admin!null){ListUmsPermissionpermissionListgetPermissionList(admin。getId());returnnewAdminUserDetails(admin,permissionList);}thrownewUsernameNotFoundException(用户名或密码错误);}}基于路径的动态权限
  其实每个接口对应的路径都是唯一的,通过路径来进行接口的权限控制才是更优雅的方式。doFilterOPTIONS白名单super。beforeInvocation(fi)AccessDecisionManagerdecide动态权限过滤器,用于实现基于路径的动态权限过滤Createdbymacroon202027。publicclassDynamicSecurityFilterextendsAbstractSecurityInterceptorimplementsFilter{AutowiredprivateDynamicSecurityMetadataSourcedynamicSecurityMetadataSAutowiredprivateIgnoreUrlsConfigignoreUrlsCAutowiredpublicvoidsetMyAccessDecisionManager(DynamicAccessDecisionManagerdynamicAccessDecisionManager){super。setAccessDecisionManager(dynamicAccessDecisionManager);}Overridepublicvoidinit(FilterConfigfilterConfig)throwsServletException{}OverridepublicvoiddoFilter(ServletRequestservletRequest,ServletResponseservletResponse,FilterChainfilterChain)throwsIOException,ServletException{HttpServletRequestrequest(HttpServletRequest)servletRFilterInvocationfinewFilterInvocation(servletRequest,servletResponse,filterChain);OPTIONS请求直接放行if(request。getMethod()。equals(HttpMethod。OPTIONS。toString())){fi。getChain()。doFilter(fi。getRequest(),fi。getResponse());}白名单请求直接放行PathMatcherpathMatchernewAntPathMatcher();for(Stringpath:ignoreUrlsConfig。getUrls()){if(pathMatcher。match(path,request。getRequestURI())){fi。getChain()。doFilter(fi。getRequest(),fi。getResponse());}}此处会调用AccessDecisionManager中的decide方法进行鉴权操作InterceptorStatusTokentokensuper。beforeInvocation(fi);try{fi。getChain()。doFilter(fi。getRequest(),fi。getResponse());}finally{super。afterInvocation(token,null);}}Overridepublicvoiddestroy(){}OverridepublicC?getSecureObjectClass(){returnFilterInvocation。}OverridepublicSecurityMetadataSourceobtainSecurityMetadataSource(){returndynamicSecurityMetadataS}}接下来我们就需要创建一个类来继承AccessDecisionManager,通过decide方法对访问接口所需权限和用户拥有的权限进行匹配,匹配则放行;动态权限决策管理器,用于判断用户是否有访问权限Createdbymacroon202027。publicclassDynamicAccessDecisionManagerimplementsAccessDecisionManager{Overridepublicvoiddecide(Authenticationauthentication,Objectobject,CollectionConfigAttributeconfigAttributes)throwsAccessDeniedException,InsufficientAuthenticationException{当接口未被配置资源时直接放行if(CollUtil。isEmpty(configAttributes)){}IteratorConfigAttributeiteratorconfigAttributes。iterator();while(iterator。hasNext()){ConfigAttributeconfigAttributeiterator。next();将访问所需资源或用户拥有资源进行比对StringneedAuthorityconfigAttribute。getAttribute();for(GrantedAuthoritygrantedAuthority:authentication。getAuthorities()){if(needAuthority。trim()。equals(grantedAuthority。getAuthority())){}}}thrownewAccessDeniedException(抱歉,您没有访问权限);}Overridepublicbooleansupports(ConfigAttributeconfigAttribute){}Overridepublicbooleansupports(C?aClass){}}decideconfigAttributesFilterInvocationSecurityMetadataSourcegetAttributesgetAttributes动态权限数据源,用于获取动态权限规则Createdbymacroon202027。publicclassDynamicSecurityMetadataSourceimplementsFilterInvocationSecurityMetadataSource{privatestaticMapString,ConfigAttributeconfigAttributeMAutowiredprivateDynamicSecurityServicedynamicSecuritySPostConstructpublicvoidloadDataSource(){configAttributeMapdynamicSecurityService。loadDataSource();}publicvoidclearDataSource(){configAttributeMap。clear();configAttributeM}OverridepublicCollectionConfigAttributegetAttributes(Objecto)throwsIllegalArgumentException{if(configAttributeMapnull)this。loadDataSource();ListConfigAttributeconfigAttributesnewArrayList();获取当前访问的路径Stringurl((FilterInvocation)o)。getRequestUrl();StringpathURLUtil。getPath(url);PathMatcherpathMatchernewAntPathMatcher();IteratorStringiteratorconfigAttributeMap。keySet()。iterator();获取访问该路径所需资源while(iterator。hasNext()){Stringpatterniterator。next();if(pathMatcher。match(pattern,path)){configAttributes。add(configAttributeMap。get(pattern));}}未设置操作请求权限,返回空集合returnconfigA}OverridepublicCollectionConfigAttributegetAllConfigAttributes(){}Overridepublicbooleansupports(C?aClass){}}这里需要注意的是,所有路径对应的权限值数据来自于自定义的DynamicSecurityS动态权限相关业务类Createdbymacroon202027。publicinterfaceDynamicSecurityService{加载资源ANT通配符和资源对应MAPMapString,ConfigAttributeloadDataSource();}一切准备就绪,把动态权限过滤器添加到FilterSecurityInterceptor之前;SpringSecurity5。4。x以上新用法配置为避免循环依赖,仅用于配置HttpSecurityCreatedbymacroon2022519。ConfigurationpublicclassSecurityConfig{AutowiredprivateDynamicSecurityServicedynamicSecuritySAutowiredprivateDynamicSecurityFilterdynamicSecurityFBeanSecurityFilterChainfilterChain(HttpSecurityhttpSecurity)throwsException{省略若干配置。。。有动态权限配置时添加动态权限校验过滤器if(dynamicSecurityService!null){registry。and()。addFilterBefore(dynamicSecurityFilter,FilterSecurityInterceptor。class);}returnhttpSecurity。build();}}如果你看过这篇仅需四步,整合SpringSecurityJWT实现登录认证!的话,就知道应该要配置这两个Bean了,一个负责获取登录用户信息,另一个负责获取存储的动态权限规则,为了适应SpringSecurity的新用法,我们不再继承SecurityConfig,简洁了不少!mallsecurity模块相关配置自定义配置,用于配置如何获取用户信息及动态权限Createdbymacroon2022520。ConfigurationpublicclassMallSecurityConfig{AutowiredprivateUmsAdminServiceadminSBeanpublicUserDetailsServiceuserDetailsService(){获取登录用户信息returnusername{AdminUserDetailsadminadminService。getAdminByUsername(username);if(admin!null){}thrownewUsernameNotFoundException(用户名或密码错误);};}BeanpublicDynamicSecurityServicedynamicSecurityService(){returnnewDynamicSecurityService(){OverridepublicMapString,ConfigAttributeloadDataSource(){MapString,ConfigAttributemapnewConcurrentHashMap();ListUmsResourceresourceListadminService。getResourceList();for(UmsResourceresource:resourceList){map。put(resource。getUrl(),neworg。springframework。security。access。SecurityConfig(resource。getId():resource。getName()));}}};}}效果测试接下来启动我们的示例项目malltinysecurity,使用如下账号密码登录,该账号只配置了访问brandlistAll的权限,访问地址:http:localhost:8088swaggerui
  然后把返回的token放入到Swagger的认证头中;
  当我们访问有权限的接口时可以正常获取到数据;
  当我们访问没有权限的接口时,返回没有访问权限的接口提示。
  总结
  SpringSecurity的升级用法确实够优雅,够简单,而且对之前用法的兼容性也比较好!个人感觉一个成熟的框架不太会在升级过程中大改用法,即使改了也会对之前的用法做兼容,所以对于绝大多数框架来说旧版本会用,新版本照样会用!
  原文链接:https:mp。weixin。qq。coms?bizMzU1Nzg4NjgyMwmid2247500055idx1sn3faa578dd23b296cdb4dbd19910d2a46utmsourcetuicoolutmmediumreferral
投诉 评论 转载

阮玲玉临终前凄凉一幕丈夫掌掴,喝下毒粥,仅留两封绝笔信阮玲玉1935年3月8日,一个女人安静地坐在桌前,面前摆放着一碗热气腾腾的白粥。碗边是两瓶空了的安眠药瓶,安眠药尽数夹杂在粥里,而她手中正拿着第三瓶,木讷地往碗里倒着。……海清的理想生活不买房中新文娱北京4月8日电(记者张曦)海清又上热搜了。这一次是帮助工作人员买房。工作人员向中新文娱确认了这一消息。作为演员,海清的角色似乎总与房子有关。《蜗居》里……去有风的地方邂逅2023年初雪,捕捉冬日小欢喜2023年的开端神仙姐姐刘亦菲和现男友捎来一缕惬意的清风吹来了久违的松弛感剧中的许红豆放下繁忙的工作来到大理云苗村这里有风、有海、有阳光……既无演技又无颜值,这9位关系户的演员,看着就让人心烦文娱情故纵编辑娱情故纵前言在娱乐圈这个地方虽然实力非常重要,但实际上有很多的演员其实并没有什么实力,反而是靠着一些关系和资本进圈。不过这些关系户虽然有着比常人……年轻朋友想要追求点生活品质?电视选TCLV8G绝对错不了回想2018年俄罗斯世界杯,当时我还窝在学校宿舍和同学用平板看球。今年世界杯我终于用上了大屏电视,今天跟大家分享一下我选购电视的经历,希望能帮到大家。其……祝福张常宁,即将与CBA富二代大婚,晒甜蜜照令人羡慕张常宁作为女排的一名悍将,不仅拥有着强势的实力,还有着很高的颜值,所以吸引了许多钟爱她的粉丝。1995年出生的她,是一位实打实的黑马,2014年3月23日张常宁入选国家女排,一……别再用过时的方式了!全新版本SpringSecurity,这前不久SpringBoot2。7。0刚刚发布,SpringSecurity也升级到了5。7。1。升级后发现,原来一直在用的SpringSecurity配置方法,居然已经被弃用了……松果里的桃花源觉慧上山砍柴,健步如飞,白猫追随在附近。在这个世界上,白猫是他唯一的朋友,觉慧没有家人,寺庙里也只有他一个人,说是寺庙,其实也只是一个普通的房子,这是他从小生活的房子,一……美国再延长352项中国产品关税豁免据路透社12月16日报道,美国贸易代表办公室16日称,将352项中国输美产品的关税豁免再延期9个月。这352项中国输美产品的豁免期原定于2022年底到期。报道称,美国贸易……2018年,我国著名主持人赴瑞士安乐死,笑着举杯需要一口闷吗2019年,一段视频突然爆火网络,画面中是和谐的一家人围坐在一起。只见居中的老人,谈笑风生,而周边的家人却在强颜欢笑,似乎有掩不住的哀愁。紧接着一个金发美女出现,递给老人……冲动是魔鬼!一拳下去,打丢了1。7亿顶薪,还有无球可打的风险场均20。2分7。0板,实力可见一斑NBA自由交易市场的大门,已经开启了两个多月的时间。而在过去的这段时间内,除了那些跌落巅峰的老将之外,绝大部分优质球员,都找到了自己的……王思雨正式加盟!四川女篮补齐争冠最后一块短板今天,四川远达美乐女篮官宣国家队核心后卫王思雨加盟,这也预示着四川女篮已经补齐了球队争冠阵容的最后一块短板。上赛季wcba联赛,两支国手云集的球队内蒙古女篮和四川女篮神仙……
头皮上总是长疙瘩和脓包?医生要警惕3种疾病作怪妈妈,你开开灯,这么黑,我看不清小米再玩绝活,全球首发2亿像素相机给廉价手机用,降维打击友商球迷留言天空体育没有C罗曼联会更好,确信滕哈赫会暗喜吃鸡光子升级小转盘?一共有3个粉级,绰号大扑棱蛾子聊聊国产手机厂商的平板电脑现状TheGonz分享他对这款阿迪达斯Ultraboost的创意焦健上海两新星都是从北京挖走的辛辛苦苦替别人做嫁衣重修月波楼,今月曾经照古人世界性突破!我国独创二氧化碳合成糖醋油,地球变暖要暂停?折叠屏市场迎黑马,押宝新方向,一举拿下6项行业年度大奖号称有数千年历史,各朝代貌似兴隆但人民其实从未真正幸福过

友情链接:中准网聚热点快百科快传网快生活快软网快好知文好找七猫云易事利