专栏电商日志财经减肥爱情
投稿投诉
爱情常识
搭配分娩
减肥两性
孕期塑形
财经教案
论文美文
日志体育
养生学堂
电商科学
头戴业界
专栏星座
用品音乐

SpringSecurity如何验证accesstoken

  在客户端获取到令牌后,访问资源时,可以设置如下请求头或者请求参数中加上accesstoken。Authorization:Beareraccesstoken
  在前两篇《auth2生成token》和《token转jwt》中,我们已经知道accesstoken产生的大体流程,并且知道如何自定义token的格式,其中,授权服务器配置中的AuthorizationServerEndpointsConfigurer可谓极为重要;而关于accesstoken的验证流程,我们就从对应的资源服务器的配置入手。1资源服务器配置
  与生成accesstoken有固定接口oauthtoken不同,我们肯定不能通过业务资源的接口地址去找到验证token源码的入口。SpringSecurity原理是责任链模式,绝大数功能都是过滤器实现的,这里也不例外。资源服务器的配置如下:
  这里重点关注一下ResourceServerSecurityConfigurer。ConfigurationEnableResourceServerpublicclassResourceServerConfigextendsResourceServerConfigurerAdapter{Overridepublicvoidconfigure(ResourceServerSecurityConfigurerresources)throwsException{resources。resourceId(message)设置资源id。tokenStore(newJwtTokenStore(jwtAccessTokenConverter()))。tokenServices(newRemoteTokenServices())。tokenExtractor(newBearerTokenExtractor());}Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{super。configure(http);}}2ResourceServerSecurityConfigurer
  在ResourceServerSecurityConfigurer中我们看到鉴权所需要的两个重要元素,Filter和AuthenticationManager。看到下面的代码,一些比较敏感的小伙伴可能会推测,所谓的accesstoken验证应该就是用这里配置的Filter和AuthenticationManager进行鉴权了。publicfinalclassResourceServerSecurityConfigurerextendsSecurityConfigurerAdapterDefaultSecurityFilterChain,HttpSecurity{。。。。。。privateOAuth2AuthenticationProcessingFilterresourcesServerFilter;privateAuthenticationManagerauthenticationManager;。。。。。。Overridepublicvoidconfigure(HttpSecurityhttp)throwsException{AuthenticationManageroauthAuthenticationManageroauthAuthenticationManager(http);N指定过滤器resourcesServerFilternewOAuth2AuthenticationProcessingFilter();resourcesServerFilter。setAuthenticationEntryPoint(authenticationEntryPoint);N设置AuthenticationManagerresourcesServerFilter。setAuthenticationManager(oauthAuthenticationManager);if(eventPublisher!null){resourcesServerFilter。setAuthenticationEventPublisher(eventPublisher);}if(tokenExtractor!null){resourcesServerFilter。setTokenExtractor(tokenExtractor);}resourcesServerFilterpostProcess(resourcesServerFilter);resourcesServerFilter。setStateless(stateless);formatter:offhttp。authorizeRequests()。expressionHandler(expressionHandler)。and()N将过滤器放到过滤器链中。addFilterBefore(resourcesServerFilter,AbstractPreAuthenticatedProcessingFilter。class)。exceptionHandling()。accessDeniedHandler(accessDeniedHandler)。authenticationEntryPoint(authenticationEntryPoint);formatter:on}privateAuthenticationManageroauthAuthenticationManager(HttpSecurityhttp){OAuth2AuthenticationManageroauthAuthenticationManagernewOAuth2AuthenticationManager();if(this。authenticationManager!null){如果自己配置了authenticationManagerif(authenticationManagerinstanceofOAuth2AuthenticationManager){oauthAuthenticationManager(OAuth2AuthenticationManager)authenticationManager;}else{returnauthenticationManager;}}oauthAuthenticationManager。setResourceId(resourceId);oauthAuthenticationManager。setTokenServices(resourceTokenServices(http));oauthAuthenticationManager。setClientDetailsService(clientDetails());returnoauthAuthenticationManager;}。。。。。。}
  通过上面的代码。addFilterBefore(resourcesServerFilter,AbstractPreAuthenticatedProcessingFilter。class)我们可以知道,用于处理令牌验证的过滤器应该就是OAuth2AuthenticationProcessingFilter了,并且默认AuthenticationManager是OAuth2AuthenticationManager。3OAuth2AuthenticationProcessingFilter
  过滤器肯定是要看doFilter了,核心逻辑如下:从request中提取出accesstoken,并构建authentication对象;设置authentication对象的details(tokentype、tokenvalue、sessionId、remoteAddress等,来源于request);利用authentication对象进行鉴权。鉴权成功对象放到SecurityContext中publicclassOAuth2AuthenticationProcessingFilterimplementsFilter,InitializingBean{privateTokenExtractortokenExtractornewBearerTokenExtractor();。。。。。。publicvoidsetAuthenticationManager(AuthenticationManagerauthenticationManager){this。authenticationManagerauthenticationManager;}publicvoidsetTokenExtractor(TokenExtractortokenExtractor){this。tokenExtractortokenExtractor;}。。。。。。publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{booleandebuglogger。isDebugEnabled();HttpServletRequestrequest(HttpServletRequest)req;HttpServletResponseresponse(HttpServletResponse)res;try{N从request中提取accesstokenAuthenticationauthenticationthis。tokenExtractor。extract(request);if(authenticationnull){if(this。statelessthis。isAuthenticated()){if(debug){logger。debug(Clearingsecuritycontext。);}SecurityContextHolder。clearContext();}if(debug){logger。debug(Notokeninrequest,willcontinuechain。);}}else{N把accesstoken放到request属性中{OAuth2AuthenticationDetails。ACCESSTOKENVALUE:accesstoken}request。setAttribute(OAuth2AuthenticationDetails。ACCESSTOKENVALUE,authentication。getPrincipal());if(authenticationinstanceofAbstractAuthenticationToken){AbstractAuthenticationTokenneedsDetails(AbstractAuthenticationToken)authentication;request中的remoteAddress、sessionId、tokenValue、tokenType等信息放到details中needsDetails。setDetails(this。authenticationDetailsSource。buildDetails(request));}N鉴权AuthenticationauthResultthis。authenticationManager。authenticate(authentication);if(debug){logger。debug(Authenticationsuccess:authResult);}this。eventPublisher。publishAuthenticationSuccess(authResult);N设置安全上下文SecurityContextHolder。getContext()。setAuthentication(authResult);}}catch(OAuth2Exceptione){SecurityContextHolder。clearContext();if(debug){logger。debug(Authenticationrequestfailed:e);}this。eventPublisher。publishAuthenticationFailure(newBadCredentialsException(e。getMessage(),e),newPreAuthenticatedAuthenticationToken(accesstoken,NA));this。authenticationEntryPoint。commence(request,response,newInsufficientAuthenticationException(e。getMessage(),e));return;}chain。doFilter(request,response);}。。。。。。}
  关于BearerTokenExtractor,作用就是从request的请求头或者请求参数中提取accesstoken,并设置tokenType(例如bearer类型),逻辑相对简单,这里就不展开了。当然我们也可以定义自己的token提取器,只要在配置资源服务器时设置给ResourceServerSecurityConfigurer对象即可。4OAuth2AuthenticationManager
  AuthenticationManager的作用就是鉴权,这里的逻辑也很简单,就是验证token是否是真的由授权服务器产生,如果是,继续校验resourceId和scope。资源服务器默认的resourceId在ResourceServerSecurityConfigurer类中,是oauth2resource。
  如果令牌对应的resourceIds是空的,就不校验resourceId了,换种说法就是:如果我们数据库接入端表中没配置resourceId,就拥有所有资源服务器的访问权限,总感觉不爽。publicclassOAuth2AuthenticationManagerimplementsAuthenticationManager,InitializingBean{privateResourceServerTokenServicestokenServices;。。。。。。publicAuthenticationauthenticate(Authenticationauthentication)throwsAuthenticationException{if(authenticationnull){thrownewInvalidTokenException(Invalidtoken(tokennotfound));}N提取accesstokenStringtoken(String)authentication。getPrincipal();N验证accesstoken是否真的由授权服务器产生OAuth2AuthenticationauthtokenServices。loadAuthentication(token);if(authnull){thrownewInvalidTokenException(Invalidtoken:token);}CollectionStringresourceIdsauth。getOAuth2Request()。getResourceIds();N校验该令牌是否拥有访问资源服务器的权限if(resourceId!nullresourceIds!null!resourceIds。isEmpty()!resourceIds。contains(resourceId)){thrownewOAuth2AccessDeniedException(Invalidtokendoesnotcontainresourceid(resourceId));}N校验令牌和client的scope是否相符checkClientDetails(auth);if(authentication。getDetails()instanceofOAuth2AuthenticationDetails){OAuth2AuthenticationDetailsdetails(OAuth2AuthenticationDetails)authentication。getDetails();Guardagainstacachedcopyofthesamedetailsif(!details。equals(auth。getDetails())){Preservetheauthenticationdetailsfromtheoneloadedbytokenservicesdetails。setDecodedDetails(auth。getDetails());}}auth。setDetails(authentication。getDetails());auth。setAuthenticated(true);returnauth;}clientDetailsService可能为null,后面我们单独说明。privatevoidcheckClientDetails(OAuth2Authenticationauth){if(clientDetailsService!null){N进入这里说明要么我们自己设置了clientDetailsService,要么资源服务与授权服务是同一个服务ClientDetailsclient;try{clientclientDetailsService。loadClientByClientId(auth。getOAuth2Request()。getClientId());}catch(ClientRegistrationExceptione){thrownewOAuth2AccessDeniedException(Invalidtokencontainsinvalidclientid);}数据库查询到的客户端配置的scopeSetStringallowedclient。getScope();N校验令牌的scopefor(Stringscope:auth。getOAuth2Request()。getScope()){if(!allowed。contains(scope)){thrownewOAuth2AccessDeniedException(Invalidtokencontainsdisallowedscope(scope)forthisclient);}}}}}
  接下来我们继续探索tokenServices。loadAuthentication(token);方法都做了什么。5ResourceServerTokenServices
  ResourceServerTokenServices的默认实现是DefaultTokenServices,这段代码可以在ResourceServerSecurityConfigurer中看到,当然,如果我们配置了resourceTokenServices,在if中则会直接返回配置的实现。publicfinalclassResourceServerSecurityConfigurerextendsSecurityConfigurerAdapterDefaultSecurityFilterChain,HttpSecurity{。。。。。。privateResourceServerTokenServicestokenServices(HttpSecurityhttp){if(resourceTokenServices!null){returnresourceTokenServices;}DefaultTokenServicestokenServicesnewDefaultTokenServices();tokenServices。setTokenStore(tokenStore());tokenServices。setSupportRefreshToken(true);tokenServices。setClientDetailsService(clientDetails());this。resourceTokenServicestokenServices;returntokenServices;}privateClientDetailsServiceclientDetails(){获取授权服务设置的ClientDetailsServicereturngetBuilder()。getSharedObject(ClientDetailsService。class);}。。。。。。}
  Security为我们提供了两个ResourceServerTokenServices子类。
  5。1DefaultTokenServices
  通过tokenStore可以推测出,这个必须要和授权服务器能够访问相同的存储才行。(JwtTokenStore比较特殊,它并没有存储token,因为验证jwt只需要对称密钥或者公钥就可以,感兴趣的小伙伴可以看JwtTokenStore的源码)publicOAuth2AuthenticationloadAuthentication(StringaccessTokenValue)throwsAuthenticationException,InvalidTokenException{N从存储中读取accesstoken,这里JwtTokenStore实现的比较特殊,是返回接收到的jwtN显然这要求授权服务器和资源服务器能否访问相同的存储,例如DB或者redisOAuth2AccessTokenaccessTokenthis。tokenStore。readAccessToken(accessTokenValue);if(accessTokennull){thrownewInvalidTokenException(Invalidaccesstoken:accessTokenValue);}elseif(accessToken。isExpired()){令牌过期处理this。tokenStore。removeAccessToken(accessToken);thrownewInvalidTokenException(Accesstokenexpired:accessTokenValue);}else{N验证token,如果是JwtTokenStore,验证jwt签名OAuth2Authenticationresultthis。tokenStore。readAuthentication(accessToken);if(resultnull){thrownewInvalidTokenException(Invalidaccesstoken:accessTokenValue);}else{这里如果我们自己没有配置clientDetailsService,默认共享授权服务的,可能是nullif(this。clientDetailsService!null){StringclientIdresult。getOAuth2Request()。getClientId();try{this。clientDetailsService。loadClientByClientId(clientId);}catch(ClientRegistrationExceptionvar6){thrownewInvalidTokenException(Clientnotvalid:clientId,var6);}}returnresult;}}}
  这里说明一下clientDetailsService,上面我们提到OAuth2AuthenticationManager和DefaultTokenServices中的this。clientDetailsService都可能是null的问题。这是因为他们的取值都是ResourceServerSecurityConfigurer中的如下方法,getSharedObject获取的是授权服务配置的ClientDetailsService。当授权服务与资源服务不是同一个服务的时候,getSharedObject就会取不到值。privateClientDetailsServiceclientDetails(){获取授权服务设置的ClientDetailsServicereturngetBuilder()。getSharedObject(ClientDetailsService。class);}
  在上面分析令牌生成时,授权服务只是提到了AuthorizationServerEndpointsConfigurer的配置,这里我们补充一下另外两个配置。ConfigurationEnableAuthorizationServerpublicclassAuthorizationServerConfigextendsAuthorizationServerConfigurerAdapter{ResourceprivateDataSourcedataSource;对auth2提供的接口做访问规则配置和添加自定义过滤器Overridepublicvoidconfigure(AuthorizationServerSecurityConfigurersecurity)throwsException{security允许表单认证,对于接口oauthtoken,如果开启此配置,并且url中有clientid和clientsecret会触发ClientCredentialsTokenEndpointFilter用于校验客户端是否有权限。allowFormAuthenticationForClients()设置接口oauthchecktoken访问权限,默认denyAll(),资源服务器可以调用这个验证token,如果是jwt,资源服务器也可以自己通过密钥验证。checkTokenAccess(isAuthenticated())提供jwt的公钥接口oauthtokenkey。tokenKeyAccess(permitAll())N添加自定义的过滤器通过AbstractAuthenticationProcessingFilter断点的additionalFilter可以看到该过滤器再链中的位置。addTokenEndpointAuthenticationFilter(newMyFilterFive())。passwordEncoder();}接入端管理配置,对应的是oauthclientdetails表,实体是BaseClientDetailsOverridepublicvoidconfigure(ClientDetailsServiceConfigurerclients)throwsException{clients。inMemory()client1是客户端授权方式。withClient(client1)接入端id。secret(newBCryptPasswordEncoder()。encode(123456))接入端密钥。resourceIds(DEMORESOURCEID)资源id。authorizedGrantTypes(clientcredentials,refreshtoken)授权方式。scopes(select)访问域。authorities(client);权限clients。jdbc(dataSource);clients。withClientDetails(newJdbcClientDetailsService(dataSource));}SpringSecurityOAuth2默认提供以下端口oauthauthorize:授权端口oauthtoken:令牌端口oauthconfirmaccess:用户确认授权提交端口oautherror:授权服务错误信息端口oauthchecktoken:用于资源服务器访问的令牌解析端口oauthtokenkey:提供公有秘钥端口,如果使用的是JWT令牌的话pathMapping可以映射成其他地址Overridepublicvoidconfigure(AuthorizationServerEndpointsConfigurerendpoints)throwsException{endpoints。pathMapping(oauthtoken,clonelitoken)。allowedTokenEndpointRequestMethods(HttpMethod。GET,HttpMethod。POST)允许的请求方式tokenStore默认内存存储,重启服务token就会失效。tokenStore(newInMemoryTokenStore())。reuseRefreshTokens(true)。tokenEnhancer()。accessTokenConverter(jwtAccessTokenConverter())用于配置密码式的授权方式,如果不设置,密码模式请求token是,token为null,TokenEndpoint会提示不支持password授权模式,这里配置就是parentAuthenticationManager。authenticationManager(authenticationManager())。tokenGranter(newTokenGranter(){OverridepublicOAuth2AccessTokengrant(Strings,TokenRequesttokenRequest){returnnull;}});}}
  在上面AuthorizationServerSecurityConfigurer的配置中,可以看到我们设置了oauthchecktoken接口。checkTokenAccess(isAuthenticated()),即需要授权才能访问该接口。
  而权限的配置就在下面AuthorizationServerSecurityConfiguration的方法中,同时有包括setSharedObject的ClientDetailsService,因此授权服务和资源服务不是同一个服务,也就没有EnableAuthorizationServer注解,就不会执行setSharedObject的操作,这就是为什么getSharedObject(ClientDetailsService。class)可能是null的原因。ConfigurationOrder(0)ClientDetailsServiceConfiguration提供clientDetailsService的beanImport({ClientDetailsServiceConfiguration。class,AuthorizationServerEndpointsConfiguration。class})publicclassAuthorizationServerSecurityConfigurationextendsWebSecurityConfigurerAdapter{。。。。。。AutowiredprivateClientDetailsServiceclientDetailsService;。。。。。。Overrideprotectedvoidconfigure(HttpSecurityhttp)throwsException{AuthorizationServerSecurityConfigurerconfigurernewAuthorizationServerSecurityConfigurer();FrameworkEndpointHandlerMappinghandlerMappingendpoints。oauth2EndpointHandlerMapping();http。setSharedObject(FrameworkEndpointHandlerMapping。class,handlerMapping);configure(configurer);http。apply(configurer);StringtokenEndpointPathhandlerMapping。getServletPath(oauthtoken);StringtokenKeyPathhandlerMapping。getServletPath(oauthtokenkey);StringcheckTokenPathhandlerMapping。getServletPath(oauthchecktoken);if(!endpoints。getEndpointsConfigurer()。isUserDetailsServiceOverride()){UserDetailsServiceuserDetailsServicehttp。getSharedObject(UserDetailsService。class);endpoints。getEndpointsConfigurer()。userDetailsService(userDetailsService);}formatter:offhttp。authorizeRequests()。antMatchers(tokenEndpointPath)。fullyAuthenticated()设置接口的访问权限。antMatchers(tokenKeyPath)。access(configurer。getTokenKeyAccess())。antMatchers(checkTokenPath)。access(configurer。getCheckTokenAccess())。and()。requestMatchers()。antMatchers(tokenEndpointPath,tokenKeyPath,checkTokenPath)。and()。sessionManagement()。sessionCreationPolicy(SessionCreationPolicy。NEVER);formatter:onsetSharedObjectclientDetailsServicehttp。setSharedObject(ClientDetailsService。class,clientDetailsService);}。。。。。。}没有EnableAuthorizationServer注解,就不会执行AuthorizationServerSecurityConfiguration的方法Target(ElementType。TYPE)Retention(RetentionPolicy。RUNTIME)DocumentedImport({AuthorizationServerEndpointsConfiguration。class,AuthorizationServerSecurityConfiguration。class})publicinterfaceEnableAuthorizationServer{}5。2RemoteTokenServices
  见名知意,这个需要调用其他服务验证accesstoken,显然能提供这个服务的应该就是授权服务了。授权服务提供了CheckTokenEndpoint用于验证accesstoken的接口如下,而其底层实现也是resourceServerTokenServices。oauthchecktoken
  调用授权服务器的oauthchecktoken接口,我们上面提到需要授权服务器设置访问权限,这里用的是客户端模式。OverridepublicOAuth2AuthenticationloadAuthentication(StringaccessToken)throwsAuthenticationException,InvalidTokenException{MultiValueMapString,StringformDatanewLinkedMultiValueMapString,String();formData。add(tokenName,accessToken);HttpHeadersheadersnewHttpHeaders();N设置请求头,客户端凭证,访问授权服务器需要认证headers。set(Authorization,getAuthorizationHeader(clientId,clientSecret));N设置请求地址,并发送请求获取验证结果MapString,ObjectmappostForMap(checkTokenEndpointUrl,formData,headers);if(map。containsKey(error)){logger。debug(checktokenreturnederror:map。get(error));thrownewInvalidTokenException(accessToken);}Assert。state(map。containsKey(clientid),Clientidmustbepresentinresponsefromauthserver);N构造OAuth2Authentication对象returntokenConverter。extractAuthentication(map);}5。3LocalTokenServices(自定义)
  当然如果上面两种校验accesstoken的实现不能满足项目需求,也可以自定义自己的ResourceServerTokenServices实现类,重写验证accesstoken的逻辑。
  综上,整个令牌验证的流程就是ResourceServerSecurityConfigurer指定了OAuth2AuthenticationProcessingFilter过滤器,过滤器调用AuthenticationManager,AuthenticationManager又调用ResourceServerTokenServices实现令牌验证,其中具体实现我们可以通过资源服务配置进行修改。
  到这里,令牌验证通过,Authentication的信息就会放到线程变量SecurityContext中,然后过滤器就会放行请求。
  不过验证令牌后得到的权限信息还没有用到。publicinterfaceAuthenticationextendsPrincipal,Serializable{Collectionlt;?extendsGrantedAuthoritygetAuthorities();。。。。。。}
  这就要提到EnableGlobalMethodSecurity系列的注解了,我们以后再说。

在东北烧烤摊吃法式鹅肝是种怎样的体验?那您可真的是让人惊呼大佬666!东北的烧烤非常好吃已经众所皆知了,通常在东北室外的烤摊都是小本生意,烤串的种类相比大店会少一些。不过你却能在烤摊吃到法式鹅肝,那么让我更不敢小觑的四猪肥肠,明明是猪身上最脏的食材之一,你为什么还那么喜欢吃?每样东西脏与不脏是相对而言,就拿猪身上的东西来说吧。大肠是装大便的,肯定大家都认为它是最脏的,猪肉是干净的。但是,在处理过程中,由于大家都认为猪肥肠是脏的,因此,清洗得非常仔细,还陇南什么地方适合穷游?如果你说的穷游是指的花费比较少,然后不买门票的话,那可能就只能去一些比较不出名的景区,在这里推荐一些比较好玩,但是又免费的景点。比如说官鹅沟,万象洞,陇南康县把阳坝自然风景区,壶口从智能楼宇到智慧楼宇的发展需要做到哪些呢?智能化浪潮席卷全球的态势下,人们对工作和生活环境的舒适度便捷性安全性提出了更高要求。同时,碳达峰碳中和相关政策的出台,为建筑楼宇用能管理戴上紧箍咒。建筑楼宇产业的传统粗放型管理模式新能源汽车真的比传统的汽车好吗?并不是的,新能源汽车和传统的汽车要进行对比观察。对于续航的稳定性方面还是差一些的。但是有一部分的混动车型,确实比汽油车型更好。新能源应该是有别已有传统能源的能源!新能源听起来就是有为什么越来越多的人选择甚至转行IT行业?谢谢邀请,国内的程序员总数差不多有500万,绝大部分还是分布在一线城市,但现在一线之外的很多城市需求量还是非常大,从整个市场来看对高手需求还是大于供方,可能很多人觉得现在每年培训出cdn是什么?CDN全称ContentDeliveryNetwork或ContentDdistributeNetwork,即内容分发网络,需要服务器请到TGDaisy9677Vicky10580三本高校的学费有多高?一般人上得起吗?感谢邀请。因为分数的原因,一些考生的分数压着本科线又想上本科,所以不得不去选择三本院校,然而报考之前,需要认真考虑三本院校的学费,因为并不是很多普通家庭能够承受的,要比普通的一本二本人是属于骨架有点大的,尤其是脚比较宽,有没有适合款式的鞋子推荐?你好,我是山宗溪,专注分享最实用最接地气的穿搭和你一样哦,我的脚型是希腊脚,第二个脚趾头比较长,而且前掌宽脚背高。市面上流行的尖头鞋对我来说就是一种折磨,买鞋实在是太难了。但是我喜阔腿裤裙怎么搭比较好看,会更适合出游?忍不住来回答这个问题,我是粗腿星人,我对阔腿裤真的是爱的深沉。1。搭配紧身针织毛衣紧身毛衣比较修身,所以微胖的小仙女穿的话会显得胖,但是和阔腿裤一起搭配穿,正好互补了,阔腿裤的宽松700块以下比较好看的球鞋有哪些推荐?本人不经常打球,所以挑的球鞋可能会不尽人意士兵12交叉绑带的设计提供了一定的包裹性,zoom气垫也有了一定的缓震KT4国货安踏的飞速成长让kt系列越来越闻名,kt4在kt3的基础上
DNF110级狂战刷图加点推荐今天,小编给大家带来DNF110级狂战刷图加点推荐。在当前版本,狂战士在有装备的基础上刷图手感好的爆炸,三速高,体验非常好。小技能上,如果其他技能不够点,建议从小怒气上减少加点,死王者荣耀S29赛季史诗改动,辅助不能再带惩戒,刺客版本又来了在王者荣耀中,为了优化玩家的体验,版本内容一直在持续调整中,其目的是增加新可玩性的同时,解决可能存在的一些问题,从已经公布的关于S29赛季的改动中,透露了许多重要信息。比如野区的环如何预防老年人骨质疏松避免股骨颈骨折?人到老年,身体机体大不如前,而预防骨质疏松对于老年人而言尤为重要,单纯的通过饮食已经无法满足身体的需要,因此要特别重视补钙。首先,系统补钙要包括开源与节流开源钙质的补充(钙片)促进湿气重,多半是因为常做这3件事,若你一个没做,身体应该很好生活在广东,人们常常提起的一句话便是湿气重啊,对于广东人而言,湿气无疑是一个无时无刻不困扰着人们的难题。中医理论将自然界致病的邪气分为六种风寒暑湿燥火。其中湿为阴邪,性质重浊粘腻,这5种绿叶菜,比牛奶含钙高,每天吃一把,全家老小钙都补足了很多人只是通过服用钙片补钙,事实上,食品才是补钙的主要来源。其实这5种绿叶蔬菜,比牛奶的含钙量还高,每天吃一把,全家老小钙都补足了。绿叶蔬菜一般补钙的食物就是含钙量比较高的,而且能吃辣椒可以降低死亡率,延长寿命?生姜是超级食物?真相告诉你香料自古以来,就是很难以取得的高等物资,因此煮任何食物用上香料后,就好像带有种疗愈的力量,其中辣味香料更是获得不少好评。不只天气冷会让人想吃麻辣锅,现在宅在家时,大家也很想煮一锅香失眠时反反复复睡不着教你几招今天白露,最舒适的节气来了白露是秋季的第三个节气,标志着孟秋结束,仲秋开始。白露是昼夜温差最大节气,基本结束了暑天的闷热,是秋季由闷热转向凉爽的转折点。此时节一夜凉过一夜,需注意增买到宝!目前今夏英超最佳五笔转会!谁改变了球队?2022年夏季转会窗口已经结束,202223赛季目前正在进行。在过去的几个月和夏天的大部分时间里,关于转会窗口的报道让人激动。新赛季已经进行了好几个星期了,我们对新签约的球员如何融杜锋三分球技术和国际球队有很大差距,要重视失误据媒体人赵环宇报道,昨日中国男篮的线上采访会中,杜锋接受采访谈到三分和失误问题。杜锋说从一开始我们在澳大利亚的四场窗口期的比赛,包括到亚洲杯的时候,我们整体三分一直是非常不错,到了伤愈复出膝盖不适,恐赛季报销,生涯至今已缺席137场据美媒报道,公牛队后卫朗佐鲍尔预计不会参加训练营,因为鲍尔现在因为一月份的膝盖手术,他现在膝盖位置有挥之不去的疼痛和不适,鲍尔的伤情反复很有可能会导致他赛季报销,鲍尔在上个赛季后段CBA联赛新格局!辽篮广东与冠军渐行渐远,两大新势力将取而代之时间过得很快,转眼间9月已经到来,现在距离CBA联赛的开赛时间只剩下1个来月了。今年夏天,国内篮坛爆出了不少热点新闻,郭艾伦要离开辽篮广东男篮的老队长周鹏转会去了深圳,高诗岩几经周
友情链接:快好找快生活快百科快传网中准网文好找聚热点快软网