版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
第9章用戶認(rèn)上面流程圖描述了用戶要操作的各個(gè)微服務(wù),用戶查看個(gè)人信息需要客戶微服務(wù),下單需要訂單微服務(wù),秒殺搶購商品需要秒殺微服務(wù)。每個(gè)服務(wù)都需要認(rèn)證用戶的,認(rèn)證成功后,需要識(shí)別用戶的角色然后對(duì)應(yīng)的功能。單點(diǎn)登用戶的項(xiàng)目中,至少有3個(gè)微服務(wù)需要識(shí)別用戶,如果用戶每個(gè)微服務(wù)都登錄一次就太麻煩了,為了提高用戶的體驗(yàn),我們需要實(shí)現(xiàn)讓用戶在一個(gè)系統(tǒng)中登錄,其他任意受信任的系統(tǒng)都可以訪問,這個(gè)功能就叫單點(diǎn)登錄。單點(diǎn)登錄(SingleSignOn),簡稱為SSO,是目前比較流行的企業(yè)業(yè)務(wù)整合的解決方案之一。SSO的第賬號(hào)登隨著國內(nèi)及國外巨頭們的平臺(tái)開放以及移動(dòng)互聯(lián)網(wǎng)的發(fā)展,第登錄已經(jīng)不是一個(gè)陌生的產(chǎn)品設(shè)計(jì)概念了。所謂的第登錄,是說基于用戶在第平臺(tái)上已有的賬號(hào)和來快速完成己方應(yīng)用的 等,國內(nèi)的比如、、QQ等222.1單點(diǎn)登錄技術(shù)方Java中有很多用戶認(rèn)證的框架都可以實(shí)現(xiàn)單點(diǎn)2.22.2登錄技術(shù)方1、ApacheShiro.3、SpringOauth2認(rèn)證第認(rèn)證技術(shù)方案最主要是解決認(rèn)證協(xié)議的通用標(biāo)準(zhǔn)問題,因?yàn)橐獙?shí)現(xiàn)跨系統(tǒng)認(rèn)證,各系統(tǒng)之間要遵循一定的接口協(xié)議。AUH協(xié)議為用戶資源的提供了一個(gè)安全的、開放而又簡易的標(biāo)準(zhǔn)。同時(shí)任何第都可以使用AUH認(rèn)證服務(wù),任何服務(wù)提供商都可以實(shí)現(xiàn)自身的AUH認(rèn)證服務(wù),因而AUH是開放的。業(yè)界提供了AUH的多種實(shí)現(xiàn)如PP、JvScip,Java,Ruy等各種語言開發(fā)包,大大節(jié)約了程序員的時(shí)間,因而OAUTH是簡易的?;ヂ?lián)網(wǎng)很多服務(wù)如OpenAPI,很多大公司如 資源的標(biāo)準(zhǔn)。Oauth協(xié)議目前發(fā)展到2.0版本,1.0版本過于復(fù)雜,2.0版本已得到廣泛應(yīng)用。參 ?fr=aladdinOauth協(xié)議:ml/rfc6749下邊分析一個(gè)Oauth2認(rèn)證的例子,程序員使用 ,開始 會(huì)對(duì)資源擁有者的進(jìn)行驗(yàn)證,驗(yàn)證權(quán),QQ認(rèn)證服務(wù)器會(huì)頒發(fā)一個(gè)碼,并重定向到程序員的3.3.客戶端獲取到 碼,請(qǐng)求認(rèn)證服務(wù)器申請(qǐng)令牌此過程用戶看不到,客戶端應(yīng)用程序請(qǐng)求認(rèn)證服務(wù) 員看到已經(jīng)登錄成功客戶端請(qǐng)求資源服務(wù)器的資源客戶端攜帶令牌資源服務(wù)器的資源。程序員攜帶令牌請(qǐng)求服務(wù)器獲取用戶的基本信息。資源服務(wù)器返回受保護(hù)資源資源服務(wù)器校驗(yàn)令牌的,如果合法則向用戶響應(yīng)資源信息內(nèi)容。注意:資源服務(wù)器和認(rèn)證服務(wù)器可以是一個(gè)服務(wù)也可以分開的服務(wù),如果是分開的服務(wù)資源服務(wù)器通常要請(qǐng)求認(rèn)證服務(wù)器來校驗(yàn)令牌的。Oauth2.0認(rèn)證流程如下:引自O(shè)auth2.0協(xié)議rfc67491、客戶端本身不資源,需要通過資源擁有者的去請(qǐng)求資源服務(wù)器的資源,比如:暢 2、資源擁有者通常為用戶,也可以是應(yīng)用程序,即該資源的3、服務(wù)器(也稱認(rèn)證服務(wù)器)用來對(duì)資源擁有的進(jìn)行認(rèn)證、對(duì)資源進(jìn)行??蛻舳艘胭Y源需要通過認(rèn)證服務(wù)器由資源擁有者授權(quán)后方可。4、資源服務(wù)器資源的服務(wù)器,比如,暢購用戶管理服務(wù)器了暢購的用戶信息, Oauth2在項(xiàng)目的應(yīng)Oauth2可以實(shí)現(xiàn)實(shí)現(xiàn)如下功能1、本系統(tǒng)第系統(tǒng)的資3、本系統(tǒng)前端(客戶端)本系統(tǒng)后端微服務(wù)的資源4、本系統(tǒng)微服務(wù)之間資源,例如:微服務(wù)A微服務(wù)B的資源,BA的資源2.3SpringsecurityOauth2認(rèn)證解決本項(xiàng)目采用Srigscrity+JW完成用戶認(rèn)證及用戶,Srigscrity是一個(gè)強(qiáng)大的和高度可定制的驗(yàn)證和控制框架,Srigscrity框架集成了Oath協(xié)議,下圖是項(xiàng)目認(rèn)證架構(gòu)圖:2、認(rèn)證服務(wù)下發(fā)用戶令牌,擁有令牌表示合法4、網(wǎng)關(guān)校驗(yàn)用戶令牌的合法,不合法表示用戶沒有登錄,如果合法則放行繼續(xù)6、資源服務(wù)完成則響應(yīng)資源信息Jwt令牌JSONWebToken(JWT)是一個(gè)開放的行業(yè)標(biāo)準(zhǔn)(RFC7519),它定義了一種簡介的、自包含的協(xié)議格式,用于在通信雙方傳遞json對(duì)象,傳遞的信息經(jīng)過數(shù)字簽名可以被驗(yàn)證和信任。JWT可以使用 HMAC算法或使用RSA的公鑰/私鑰對(duì)來簽名,防止被篡改。4、資源服務(wù)使用JWT可不依賴認(rèn)證服務(wù)即可完 2、以2、以在令牌自定義富的內(nèi)容,易展。{{"sub":""name":"admin":}3.1令牌結(jié)頭部包括令牌的類型(即JWT)及使用的哈希算法(如HMACSHA256或RSA)第二部分是負(fù)載,內(nèi)容也是一個(gè)jso對(duì)象,它是存放有效信息的地方,它可以存放jw如:s(簽發(fā)者)xp(過期時(shí)間戳),su(面向的用戶)等,也可自定義字段。此部分不建議存放敏感信息,因?yàn)榇瞬糠挚?{"alg":"typ":}1、JWT令牌較長, 空間比較大簽名算法進(jìn)行簽名。一個(gè)例子base6UrlEncode(header)+.base64UrlEncode(header):jwt令牌的第一部分。base64UrlEncode(payload):jwt令牌的第二部分。base6UrlEncode(header)+.生成私鑰公1、生成密鑰下邊命令生成密鑰,采用RSA算法每個(gè)包含公鑰和私KeytoolKeytool是一個(gè)java提供 查 keytool-list-keystore-alias:密鑰的別-keyalg:使用的hash算-keypass:密鑰-keystore:密鑰庫文件名,changgou.jks保存了生-storepass:密鑰庫keytool-genkeypair-aliaschanggou-keyalgRSA-keypasschanggou-keystorechanggou.jks-storepasschanggou2、導(dǎo)出公安 執(zhí)行如下命令keytoolkeytool-list-rfc--keystorechanggou.jks|opensslx509-informpem- -----BEGINPUBLICKEY---- -----ENDPUBLICKEY----基于私鑰生成jwt令將課件中changgou_user_auth的工程導(dǎo)入到項(xiàng)目中去,如下publicpublicclassCreateJwtTest*創(chuàng)建令牌測試publicvoid 文件路String//String//秘Stringkeypwd=//秘鑰別Stringalias=路ClassPathResourceresource=new//創(chuàng)建秘鑰工KeyStoreKeyFactorykeyStoreKeyFactory=new KeyPairkeyPair=//獲取私RSAPrivateKeyrsaPrivate=(RSAPrivateKey)//定義Map<String,Object>tokenMap=newHashMap<>();tokenMap.put("id","1");tokenMap.put("name","itheima");tokenMap.put("roles","ROLE_VIP,ROLE_USER");//生成Jwt令//取出令Stringencoded=jwt.getEncoded();}}基于公鑰解析jwt令在chan 創(chuàng)建測試類 .chaggo.toePsJwtst實(shí)現(xiàn)解析校驗(yàn)令牌據(jù),代碼如下:publicpublicclassParseJwtTest*校驗(yàn)令牌publicvoid//令Stringtoken=//公Stringpublickey="-----BEGINPUBLICKEY----- PUBLIC //校驗(yàn)Jwtjwt=JwtHelper.decodeAndVerify(token,new//獲取Jwt原始內(nèi)Stringclaims=jwt.getClaims();//jwt令Stringencoded=jwt.getEncoded();}}Oauth2.04.1準(zhǔn)備工1)搭建認(rèn)證服務(wù)器之前,先在用戶系統(tǒng)表結(jié)構(gòu)中增加如下表結(jié)`resource_ids``resource_ids`varchar(256)DEFAULT`client_secret`varchar(256)DEFAULTNULLCOMMENT'客戶端秘鑰,`scope`varchar(256)DEFAULTNULLCOMMENT'對(duì)應(yīng)的范圍`authorized_grant_types`varchar(256)DEFAULTNULLCOMMENT'認(rèn)證模式`web_server_redirect_uri`varchar(256)DEFAULTNULLCOMMENT'認(rèn)證后重定向地址`authorities`varchar(256)DEFAULT`access_token_validity`int(11)DEFAULTNULLCOMMENT'令牌有效期`refresh_token_validity`int(11)DEFAULTNULLCOMMENT'令牌刷新周期`additional_information`varchar(4096)DEFAULT`autoapprove`varchar(256)DEFAULTNULL,PRIMARYKEY(`client_id`))ENGINE=InnoDBDEFAULT4.24.2 模式介Oauth2有以 碼模式(Authorization隱 模式模式(ResourceOwnerPassword客戶端模式(ClientINSERTINTO`oauth_client_details`VALUES('changgou',null,'$2a$10$Yvkp3xzDcri6MAsPIqnzzeGBHez1QZR3A079XDdmNU4R725KrkXi2','app', ',null,'43200','43200',null,其中碼模式和模式應(yīng)用較多,本小節(jié)介紹碼模式4.2.1碼模碼流1、客戶端請(qǐng)求3、客戶端獲取到碼,請(qǐng)求認(rèn)證服務(wù)器申請(qǐng)令5、客戶端請(qǐng)求資源服務(wù)器的資源,資源服務(wù)校驗(yàn)令牌,完請(qǐng)請(qǐng)求認(rèn)證服務(wù)獲 client_id:客戶端id, 配置類中設(shè)置的客戶端id一致 redirect_uri:跳轉(zhuǎn)uri, 碼申請(qǐng)成功后會(huì)跳轉(zhuǎn)到此地址,并在后邊帶上code參數(shù) 碼Get?首先跳轉(zhuǎn)到登錄頁面輸入賬號(hào)和 ,點(diǎn)擊i。SrigSecuiy接收到請(qǐng)求會(huì)調(diào)用UsrDtlsService接口的lUsrByUsra方法查詢用戶正確的。當(dāng)前導(dǎo)入的基礎(chǔ)工程中客戶端D為cag也為cag即可認(rèn)證通過。點(diǎn)擊點(diǎn)擊Atoriz,接下來返回 碼:認(rèn)證服務(wù)攜帶 碼跳轉(zhuǎn)eiect_ur,code=k45iY就是回的授權(quán)碼,每一個(gè) 碼只能使用一次申請(qǐng)拿到碼后,申請(qǐng)令牌Post請(qǐng)求 類型,填寫authorization_code,表 碼模 碼,就是剛剛獲取 碼,注意 碼只使用一次就無效了,需要重新申請(qǐng)redirect_uri:申 碼時(shí)的跳轉(zhuǎn)url,一定和申 碼時(shí)用的redirect_uri一致此需要使用httpBasic認(rèn)證。什么是httpBasic認(rèn)證?base64編碼,放在header中請(qǐng)求服務(wù)端,一個(gè)例子:Athorization:BsicWZWJBcA6NZWJBcA=NZWJBcA6ZWJBcA=名:的bse64編碼。認(rèn)證失敗服務(wù)端返回401Unauthorized。httpbasic認(rèn)證客戶端Id和客戶 會(huì)匹客戶端Id和客戶 會(huì)匹配數(shù)據(jù)庫oauth_client_details表中的客戶端id及客戶 返返回信如下用用BearerToken(http:/ token_type:有MACtoken_type:有MACokenBeareroken種類型,種的校驗(yàn)算法同,RC6750建議Oauth2SpringSecurityOauth2提供校驗(yàn)令牌的Get:token?token=參數(shù)token使用postman測試如下如果令牌校驗(yàn)失敗,會(huì)出現(xiàn)刷新 固定 refresh_token:刷新令牌(注意不是access_token,而是4.2.2模模式(ResourceOwnerPasswordCredentials)與碼模式的區(qū)別是申請(qǐng)令牌不再使用碼,而是直接通過用戶名和即可申請(qǐng)令牌。申請(qǐng)令牌PostPost請(qǐng)求攜帶參數(shù) 并且此需要使用httpBasic認(rèn)證測試數(shù)據(jù)如下4.3資源服資源服務(wù)擁有要的受保護(hù)資源,客戶端攜帶令牌資源服務(wù),如果令牌合法則可成功資源服務(wù)中的資源,如下圖:上圖上圖的業(yè)務(wù)流程如下4.3.1用戶服務(wù)對(duì)接1、客戶端請(qǐng)求認(rèn)證服務(wù)申請(qǐng)令2、認(rèn)證服務(wù)生成令牌認(rèn)證服務(wù)采用非對(duì)稱加密算法,使用私鑰生成令 資源服務(wù)客戶端在Httpheader中添加:Authorization:Bearer令牌。 5、令牌有效,資源服務(wù)向客戶端響應(yīng)資源信基本上所有微服務(wù)都是資源服務(wù),這里我們?cè)谡n程管理服務(wù)上配置控制,當(dāng)配置了控制后如課程信息則必須提供令牌。2、添加依 @EnableGlobalMethodSecurity(prePostEnabled=true,securedEnabled=true)//激活方publicclassResourceServerConfigextendsResourceServerConfigurerAdapter//公privatestaticfinalStringPUBLIC_KEY=定義@parampublicTokenStoretokenStore(JwtAccessTokenConverterjwtAccessTokenConverter){returnnew}定義publicJwtAccessTokenConverterreturn}獲取非對(duì)稱加密公鑰<artifactId>spring-cloud-starter-privateprivateStringgetPubKey()Resourceresource=newClassPathResource(PUBLIC_KEY);try{InputStreamReaderinputStreamReader=newreturnbr.lines().collect(Collectors.joining("\n"));}catch(IOException{return}}Http安全配置,對(duì)每個(gè)到達(dá)系統(tǒng)的http請(qǐng) 進(jìn)行校@param@throwspublicvoidconfigure(HttpSecurityhttp)throwsException//"/user/add").// 址放 //}}4.3.2資源服務(wù)測不攜帶令由于該地址受限制,需要,所以出現(xiàn)如下錯(cuò)誤{{"error":"error_description":"Fullauthenticationisrequiredtoaccessthis}攜帶在httpheader中添加Authorization:Bearer11、用戶登錄,請(qǐng)求認(rèn)證服2、認(rèn)證服務(wù)認(rèn)證通過,生成jwt令牌,將jwt令牌及相關(guān)信息寫入Redis,并且 令牌寫3、用 資源頁面,帶 到網(wǎng)4、網(wǎng)關(guān) 獲取token,并查詢Redis校驗(yàn)token,如果token不存在 ,否則放5、用戶退出,請(qǐng)求認(rèn)證服務(wù),清除redis中的token,并且刪 中的當(dāng)輸入錯(cuò)誤的令牌也無法正當(dāng)輸入錯(cuò)誤的令牌也無法正 需求分功能流程圖如下執(zhí)行流執(zhí)行流程使用 用客戶客戶 2、由jwt令牌過2、由jwt令牌過長,宜,所以將jwt在在redis,由客戶端請(qǐng)求服務(wù)端獲取并在將認(rèn)證服務(wù)changgou_user_auth中的aplicatio.yl配置文件中的Rs配置改成自己對(duì)應(yīng)的端口和密碼。認(rèn)證服認(rèn)證服務(wù)需要實(shí)現(xiàn)的功能如1、登錄接 將令牌寫。2、退出接口校驗(yàn)當(dāng)前用戶的為合法并且為已登錄狀態(tài)。將令牌從redis刪除。刪除 ttl:1200#token clientId:changgou clientSecret:changgou#客戶端秘鑰: 保存對(duì)應(yīng)MaxAge:- 過期時(shí)間,-1表示瀏覽器關(guān)閉則銷為了不破壞SrigSecuiy的代碼,我們?cè)赟vic方法中通過estemlat請(qǐng)求SrigSecrty露的申請(qǐng)令牌接口來申請(qǐng)令牌,下邊是測試代碼:publicprivateLoadBalancerClientprivateRestTemplate*發(fā)送Http請(qǐng)求創(chuàng)建令publicvoidtestCreateToken()throwsInterruptedException//采用客戶端負(fù)載均衡,從eureka獲取認(rèn)證服務(wù)的ip和端ServiceInstanceserviceInstance=
URIuri=//申請(qǐng)令牌地StringauthUrl=uri+//1、header信息,包括了httpbasic認(rèn)證信MultiValueMap<String,String>headers=newLinkedMultiValueMap<String,//進(jìn)行Base64編碼,并將編碼后的認(rèn)證數(shù)據(jù)放到頭Stringhttpbasic=httpbasic("changgou","changgou");headers.add("Authorization",httpbasic);//2、指定認(rèn)證MultiValueMap<String,String>body=newLinkedMultiValueMap<String,HttpEntity<MultiValueMap<String,String>>(body,headers);//指 restTemplate當(dāng)遇到400或401響應(yīng)時(shí)候也不要拋出異常,也要正常返回restTemplate.setErrorHandler(new{IOException{//當(dāng)響應(yīng)的值為400或401時(shí)候也要正常響應(yīng),不要拋出if(response.getRawStatusCode()!=400&&response.getRawStatusCode()!=401){}} 調(diào)用申請(qǐng)令ResponseEntity<Map>exchange=restTemplate.exchange(authUrl,HttpMethod.POST,multiValueMapHttpEntity,Map.class);Mapresult=exchange.getBody();}@param@paramprivateStringhttpbasic(StringclientId,String//將客戶端id和客戶 拼接,按“客戶端id:客戶 Stringstring=//進(jìn)行base64byte[]encode=Base64Utils.encode(string.getBytes());return"Basic"+newString(encode);}}AuthServiceImplAuthServiceImpl實(shí)現(xiàn)publicclassAuthServiceImplimplementsAuthServiceprivateRestTemplateprivateLoadBalancerClientprivateStringRedisTemplateprivatelongttl;申請(qǐng)@param@param@param@parampublicAuthTokenapplyToken(Stringusername,Stringpassword,StringclientId,StringclientSecret){publicinterfaceAuthServiceAuthTokenlogin(Stringusername,Stringpassword,StringclientId,String}URIuri=serviceInstance.getUri();Stringurl=uri+"/oauth/token";MultiValueMap<String,String>body=newLinkedMultiValueMap<>();MultiValueMap<String,String>headers=newLinkedMultiValueMap<>();DefaultResponseErrorHandler(){@OverrideIOException{if(response.getRawStatusCode()!=400&&}}ResponseEntity<Map>responseEntity=restTemplate.exchange(url,HttpMethod.POST,requestEntity,Map.class);Mapmap=if(map==null||map.get("access_token")==null||map.get("refresh_token")==null||thrownewRuntimeException("申請(qǐng)令牌失敗}AuthTokenauthToken=newAuthToken();authToken.setAccessToken((String)map.get("access_token"));authToken.setRefreshToken((String)map.get("refresh_token"));authToken.setJti((String)map.get("jti"));ken(),ttl,TimeUnit.SECONDS);return}privateStringgetHttpBasic(StringclientId,StringclientSecret)Stringvalue=byte[]encode=Base64Utils.encode(value.getBytes());return"Basic"+newString(encode);}} publicclass publicclassAuthControllerprivateAuthServiceprivateStringprivateStringprivate;privatepublicResultlogin(Stringusername,StringifthrownewRuntimeException("用戶名不存在}ifthrownew 不存在}AuthTokenauthToken=returnnewResult(true,StatusCode.OK,"登錄成功}privatevoid(String{HttpServletResponseresponse= }使用postman1Post請(qǐng)求當(dāng)前在認(rèn)證服務(wù)中,用戶是寫死在用戶認(rèn)證類中。所以用戶登錄時(shí),無論帳號(hào)輸入什么,只要是h都可以。因此需要?jiǎng)討B(tài)獲取用戶帳號(hào)與.定義被接用戶微服務(wù)對(duì)外根據(jù)用戶名獲取用戶信息接publicUserfindUserInfo(@PathVariable("username")Stringusername){returnuserService.findById(username);}放行該接口,修改ResourceServerCon?g定義feign接publicinterfaceUserFeignpublicUserfindUserInfo(@PathVariable("username")String}認(rèn)證服務(wù)添加依修改認(rèn)證服務(wù)啟修改用戶認(rèn)證@EnableFeignClients(basePackages=<version>1.0-測試測試:重新啟動(dòng)服新建網(wǎng)關(guān)工程<artifactId>spring-cloud-starter-<artifactId>spring-cloud-starter-netflix-<artifactId>spring-cloud-starter-netflix-eureka-<!--redis--<artifactId>spring-boot-starter-data-redis-3)3)創(chuàng)建name:gateway-web'[/**]':#匹配所有請(qǐng)求allowedOrigins:"*"#跨域處理允許所有的域allowedMethods:#-id:changgou_goods_routeuri:lb://goodspublicclassWebGateWayApplicationpublicstaticvoidmain(String[]{}}#-StripPrefix=1id:changgou_user_routeuri:lb://user-id:changgou_oauth_useruri:lb://user-authhost:prefer-ip-address:trueenabled:trueinclude:true網(wǎng)關(guān)全局過濾新建過濾器類新建過濾器類AuthorizeFilter,業(yè)務(wù)邏輯2)判斷中是否存在信息,沒有的話publicpublicclassAuthFilterimplementsGlobalFilter,OrderedpublicstaticfinalStringAuthorization=privateAuthServicechain){//獲取當(dāng)前請(qǐng)求對(duì)ServerHttpRequestrequest=excha
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年鹽城道路客運(yùn)輸從業(yè)資格證考試培訓(xùn)試題和答案
- 人教部編版二年級(jí)語文上冊(cè)第19課《古詩二首》精美課件
- 吉首大學(xué)《機(jī)器學(xué)習(xí)及其應(yīng)用》2021-2022學(xué)年期末試卷
- 吉首大學(xué)《比較文學(xué)導(dǎo)論》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林藝術(shù)學(xué)院《小型樂隊(duì)編配》2021-2022學(xué)年第一學(xué)期期末試卷
- 吉林藝術(shù)學(xué)院《媒體應(yīng)用與品牌戰(zhàn)略》2021-2022學(xué)年第一學(xué)期期末試卷
- 偷偷藏了離婚協(xié)議書范本小說
- 2024年公租房便利店轉(zhuǎn)讓協(xié)議書模板
- 吉林師范大學(xué)《油畫人像表現(xiàn)技法》2021-2022學(xué)年第一學(xué)期期末試卷
- 國美解除買賣合同協(xié)議書范文
- 4.1DNA是主要的遺傳物質(zhì)課件高一下學(xué)期生物人教版必修2
- 人民群眾是歷史的創(chuàng)造者
- (高清版)DZT 0208-2020 礦產(chǎn)地質(zhì)勘查規(guī)范 金屬砂礦類
- 《堂堂正正做君子》課件
- 肺功能檢查及其臨床應(yīng)用幻燈課件
- 綠化及景觀工程施工組織設(shè)計(jì)
- 拍攝腳本范文
- 藥品市場調(diào)查與客戶需求分析培訓(xùn)
- 收費(fèi)員安全培訓(xùn)
- 正確認(rèn)識(shí)人的本質(zhì)
- 兒童心理學(xué)教育培訓(xùn)家庭教育輔導(dǎo)
評(píng)論
0/150
提交評(píng)論