版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
Shiro課程目Shiro123shirourl4Shiro5、掌握Shiro進(jìn)行的常用方法6Shiro權(quán)限管什么是權(quán)限管管理實現(xiàn)對用戶系統(tǒng)的控制按照安全規(guī)則或者安全策略控制用戶可以而且只能訪戶首先經(jīng)過認(rèn)證,認(rèn)證通過后用戶具有該資源的權(quán)限方可。用戶認(rèn)概是系統(tǒng)通過核對用戶輸入的用戶名和口令看其是否與系統(tǒng)中的該用戶的用戶名和口令用用戶是否認(rèn)通過用戶名認(rèn)證流是是否允問訪YES繼YES繼進(jìn)行用 認(rèn)YES繼 是否認(rèn)證通過NO繼續(xù)認(rèn)關(guān)鍵對Subject:主箱地址等,一個主體可以有多個,但是必須有一個主(PrimaryPrincipalcredential是只有主體自己知道的安全信息,如、等概,即控制,控制誰能哪些資源。主體進(jìn)行認(rèn)證后需要分配權(quán)限方可系統(tǒng)的資源,對于某些資源沒有權(quán)限是無法的。流權(quán)限控認(rèn)權(quán)限控認(rèn)分配權(quán)NO系統(tǒng)資繼繼關(guān)鍵對Who,即主體(Subject),主體需要系統(tǒng)中的資源How,權(quán)限/(Permission),規(guī)定了主體對資源的操作,權(quán)限離開資源沒有意義,如用戶查詢權(quán)限、用戶添限、某個類方法的調(diào)用權(quán)限、編號為001用戶的修改權(quán)限等,通過權(quán)限可知主體對哪些資源都有哪些操作。主主(用戶權(quán)(查詢權(quán)(添加權(quán)(刪除權(quán)類型商品資(商品信息資權(quán)限模主體(賬號、)資源(資源名稱、地址)********用角權(quán)1111****用角1資資源(資源名稱、地址)權(quán)限(權(quán)限名稱、資源名稱、資源地址*****多對多對1111****權(quán)限分權(quán)限控用戶擁有了權(quán)限即可操作權(quán)限范圍內(nèi)的資源,系統(tǒng)不知道主體是否具有權(quán)限需要對用戶的進(jìn)行控制?;诮巧目豏BAC基于角色的控制(Role-BasedAccessControl)是以角色為中心進(jìn)行控制,比如:主體的角色為總經(jīng)理可以查詢企業(yè)運營報表,查詢員工工資信息等,控制YESYES查詢工資信無無處(通常提示用戶無權(quán)操作}缺點:以角色進(jìn)行控制粒度較粗,如果上圖中查詢工資所需要的角色變化為總經(jīng)理和if(主體.hasRole("總經(jīng)理角色id")|| }基于資源的控制,比如:主體必須具有查詢工資權(quán)限才可以查詢員工工資信息等,控制流程如下:}權(quán)限管理解決方粗顆粒度和細(xì)顆粒什么是粗顆粒度和細(xì)顆粒如何實現(xiàn)粗顆粒度和細(xì)顆粒service接口添url基于url是企業(yè)中常用的權(quán)限管理方法,實現(xiàn)思路是:將系統(tǒng)操作的每個url配置在權(quán)限表中,將權(quán)限對應(yīng)到角色,將角色分配給用戶,用戶系統(tǒng)功能通過Filter進(jìn)行過慮過慮器獲取到用戶的url只要的url是用戶分配角色中的url則放行繼續(xù)。獲 獲 Url是否公開地( 地址是否存在url是否公開地Url是否是公地址(只 認(rèn) 是否存在權(quán)限url獲 過慮認(rèn)證過慮系統(tǒng)的資提示無權(quán)操放行繼放行繼放行繼放行繼 YES認(rèn)證通NO進(jìn)行用 認(rèn)使用權(quán)限管理框省系統(tǒng)開發(fā)時間,并且權(quán)限管理框架提供了完善的認(rèn)證和功能有利于系統(tǒng)擴(kuò)展,但基于url實環(huán)境準(zhǔn)webUI:jqueryeasyUI1.2.2數(shù)據(jù)mysql5.1導(dǎo)入,先導(dǎo)入shiro_sql_talbe.sql再導(dǎo)入shiro-sql_table_data.sqlactiveUser用戶activeUseractiveUsersessionpublicpublicclassActiveUserimplementsjava.io.SerializableprivateStringuserid;//用戶idprivateStringusercode;用戶賬號privateStringusername;privates;privateList<SysPermissionpermissionsanonymousURL.properties公開地址,無需認(rèn)證即可用戶認(rèn)證filter實現(xiàn)。publicpublicclassLoginInterceptorimplementsHandlerInterceptor在進(jìn)入controller//使用場景:比 認(rèn)證校publicbooleanpreHandle(HttpServletRequestHttpServletResponseresponse,Objecthandler)Exception)List<String>open_urls的Stringurl=for(Stringopen_url:open_urls)if(url.indexOf(open_url)>=0)//如 的是公開地址則放return}}HttpSessionsession=ActiveUseractiveUser=(ActiveUser)if(activeUser!=null)return}return}用戶使用springmvc器對用戶url進(jìn)行如果用戶的url沒有分配權(quán)限則跳轉(zhuǎn)到無權(quán)操作提示頁面(refuse.jspfilter實現(xiàn)。publicpublicclassPermissionInterceptorimplementsHandlerInterceptor在進(jìn)入controller//使用場景:比 認(rèn)證校進(jìn)入actionpublicbooleanpreHandle(HttpServletRequestHttpServletResponseresponse,Objecthandler)Exception//TODOAuto-generatedmethod//用 地址Stringurl=)List<String>open_urls//用 的for(Stringopen_url:open_urls)if(url.indexOf(open_url)>=0)//如 的是公開地址則放return}}//從session獲取用戶公 地址(認(rèn)證通過無需分配權(quán)限即 List<String>common_urls=//用 的for(Stringcommon_url:common_urls)if(url.indexOf(common_url)>=0)//如 的是公共地址則放return}}}//HttpSessionsession=request.getSession();ActiveUseractiveUser=(ActiveUser)取出session中權(quán)限List<SysPermission>permission_list=//校驗用 地址是否在用戶權(quán)限范圍for(SysPermissionsysPermission:permission_list){Stringpermission_url=sysPermission.getUrl();if(url.contains(permission_url)){return}}request,response);return}用戶登url等)activeUsersession。publicStringloginsubmit(HttpSessionsession,Stringpassword,Stringrandomcode)throwsStringvali 錯thrownew } 認(rèn)ActiveUseractiveUser=sysService.authenticat(usercode,session.setAttribute("activeUseractiveUser);return}service接**Title:@param@param@returnActiveUser@throwspublicActiveUserauthenticat(Stringusercode,StringthrowspublicSysUserfindSysuserByUsercode(Stringusercode)根據(jù)用戶idpublicList<SysPermission>findSysPermissionList(Stringthrows根據(jù)用戶id shiro介什么為什么要學(xué)shiroshiro就可以非常快速shiro。java領(lǐng)域中springsecurity(原名Acegi)也是一個開源的權(quán)限管理框架但是springsecurity依賴spring運行shiro就相對獨立,最主要是因為shiro使用簡單、靈活,所以現(xiàn)在越來shiro。Shiro架Subjectsubject進(jìn)行交互,subject記錄了當(dāng)前操作用戶,將用戶的SubjectshirosubjectsubjectSecurityManager責(zé)對所有的subject進(jìn)行安全管理通過SecurityManager可以完成subject的認(rèn)證等,實質(zhì)上SecurityManager是通過Authenticator進(jìn)行認(rèn)證,通過Authorizer進(jìn)行,通過SessionManager進(jìn)行會話管理等。SecurityManagerAuthenticator,Authorizer,SessionManager這三個Authenticator即認(rèn)證器,對用戶進(jìn)行認(rèn)證,Authenticator是一個接口,shiro提供ModularRealmAuthenticatorModularRealmAuthenticator基本上可以滿足大多Authorizer即器,用戶通過認(rèn)證器認(rèn)證通過,在功能時需要通過器判斷用securityManager注意:realm理解成只是從數(shù)據(jù)源取數(shù)據(jù),在realm中還有認(rèn)證校驗的相關(guān)shiro所以shiro可以使用在非web應(yīng)用上,也可以將分布式應(yīng)用的會話集中在一點管理,此特性SessionDAO即會話dao,是對session會話操作的一套接口,比如要將session到數(shù)據(jù)庫,可以通過jdbc將會話到數(shù)據(jù)庫。CacheManager即緩存管理,將用戶權(quán)限數(shù)據(jù)在緩存,這樣可以提高性能Cryptography即管理,shiro提供了一套加密/的組件,方便開發(fā)。比如提供用的散列、加/等功能shirojarjavashirojarshiro提供的功能了。shiro-core是包必須選用,還提供了與web整合的shiro-web、與spring整合的shiro-springquartzshiro-quartzshirojarmaven坐標(biāo)。<artifactId>shiro-<artifactId>shiro-<artifactId>shiro-<artifactId>shiro-<artifactId>shiro-shiro-allshiro<artifactId>shiro-參考 shiro認(rèn)認(rèn)證流構(gòu)構(gòu)造SecurityManager環(huán)提交認(rèn)執(zhí)行認(rèn)執(zhí)行認(rèn)根 獲取驗證信程序(用戶登陸和退出java工jdkshiro-coreJar包及依賴log4j.rootLogger=debug, -%mShiro.iniSecurityManager環(huán)境。配置eclipseini文件編輯:在eclipse配置后,在classpath創(chuàng)建shiro.ini配置文件,為了方便測試將用戶名和配置shiro.ini配置文件中:認(rèn)證代publicvoidtestLoginLogout()構(gòu)建SecurityManager工廠,IniSecurityManagerFactory可以從ini文件Factory<SecurityManager>factory=通過工廠創(chuàng)建SecurityManagersecurityManager=將securityManager創(chuàng)建一個Subject實例,該實例認(rèn)證要使用上邊創(chuàng)建的securityManager行行Subjectsubject=創(chuàng)建tokenUsernamePasswordTokentoken=newtry}catch(AuthenticationExceptione)//TODOAuto-generatedcatchblock}BooleanisAuthenticated=System.out.println("用戶認(rèn)證狀態(tài):isAuthenticated=System.out.println("用戶認(rèn)證狀態(tài):}認(rèn)證執(zhí)行流1token令牌,token3AuthenticatorModularRealmAuthenticatorrealmini配置文件取用戶真實的賬號和,這里使用的是IniRealm(shiro自帶)4IniRealmtokenini常見的異 foundforuser。。。。當(dāng)輸入錯誤會拋此異常,如下: ception:Submitted rememberMe=false]didnotmatchtheexpectedcredentials. ception(憑證過期)等自定上邊的程序使用的是Shiro自帶的IniRealmIniRealm從ini配置文件中用戶的信息,大部分情況下需要從系統(tǒng)的數(shù)據(jù)庫中用戶信息,所以需要自定義realm。shiro提供的最基礎(chǔ)的是Realm接口,CachingRealm負(fù)責(zé)緩存處理,AuthenticationRealmAuthorizingRealm負(fù)責(zé),通常自定義的realm繼承AuthorizingRealm自定publicpublicclassCustomRealm1extendsAuthorizingRealmpublicStringgetName()return}publicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{//從tokenStringusername=(String)returnreturn}Stringpassword"123";//SimpleAuthenticationInfosimpleAuthenticationInfonewusername,password,return}protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){//TODOAuto-generatedmethodreturn}}# 測試代測試代碼同程序,將ini的地址修改為shiro-realm.ini。散列算 轉(zhuǎn)成原始內(nèi)容散列算法常用于對進(jìn)行散列常用的散列算法有MD5SHA。一般散列算法需要提供一個salt(鹽)與原始內(nèi)容生成 性,比如:111111的md5值是:96e eb72c92a549dd5a330112,拿著 eb72c92a549dd5a330112”去md5很容易進(jìn)行,如果要是對111111和salt(鹽,一個隨機(jī)數(shù))進(jìn)行散列,這樣雖然都是111111加不同的鹽會生成例Stringpassword_md5newMd5Hash("111111").toString();Stringpassword_md5_sale_1=newMd5Hash("111111","eteokues",Stringpassword_md5_sale_2=newMd5Hash("111111","uiwueylm",StringsimpleHash=newSimpleHash("MD5","111111",realm中使realm從數(shù)據(jù)庫取出鹽和加密后的值由shiro完成校驗。自定protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{Stringusername=(String)鹽是是Stringpassword=Stringsalt="eteokues";SimpleAuthenticationInfosimpleAuthenticationInfo=username,password,return}realm配. 測試代inishiro流根根獲取資源權(quán)限信執(zhí)執(zhí)方Shiro支持三種方式的編程式:通過寫if/else代碼塊完成Subjectsubject=SecurityUtils.getSubject();if(subject.hasRole(“admin”)){//}else//}Javapublicvoido(){//}JSP/GSP:在JSP/GSP頁面通過相應(yīng)的完成<!本序測試使用第一種編程方式,實際與web系統(tǒng)集成使用后兩種方式測 在ini文件中用戶、角色、權(quán)限的配置規(guī)則是用戶名=,角色1,角色2...”“角色=12...權(quán)限字符串規(guī):”是資源測試代permission.ini publicvoidtestPermission()從ini文件中創(chuàng)建SecurityManagerFactory<SecurityManager>factory=創(chuàng)建SecurityManagersecurityManager=將securityManagerSubjectsubject=
//設(shè)置用戶認(rèn)證的 UsernamePasswordTokentoken=newUsernamePasswordToken("zhang",try}catch(AuthenticationExceptione)//TODOAuto-generatedcatchblock}BooleanisAuthenticated=System.out.println("用戶認(rèn)證狀態(tài)://用 檢測基于角System.out.println("用戶是否擁有一個角色:System.out.println("用戶是否擁有多個角色:"+subject.hasAllRoles(Arrays.asList("role1","role2"))); subject.checkRoles(Arrays.asList("role1", //System.out.println("是否擁有某一個權(quán)限:System.out.println("是否擁有多個權(quán)限:"+subject.isPermittedAll("user:create:1","user:delete"));}基于角色////用 檢測基于角System.out.println("用戶是否擁有一個角色:System.out.println("用戶是否擁有多個角色:"+subject.hasAllRoles(Arrays.asList("role1","role2")));subject.checkRoles(Arrays.asList("role1",subject.checkRoles(Arrays.asList("role1",上邊check方法如果失敗則拋出異常org.apache.shiro.authz.UnauthorizedException:Subjectdoesnothaverole 基于資System.out.println("是否擁有某一個權(quán)限:System.out.println("是否擁有多個權(quán)限:+subject.isPermittedAll("user:create:1",check上邊check方法如果失敗則拋出異常org.apache.shiro.authz.UnauthorizedException:Subjectdoesnothavepermission 自定realm代realmdoGetAuthorizationInfo方法,此方法需要完成:根據(jù)用戶從數(shù)據(jù)庫查詢權(quán)限字符串,由shiro進(jìn)行。protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){Stringusername=(String)//根 從數(shù)據(jù)庫中查詢權(quán)限數(shù) List<String>permissions=newArrayList<String>();SimpleAuthorizationInfosimpleAuthorizationInfonewfor(Stringpermission:permissions){}return}ini測試代同上邊的測試代碼,注意修改ini地址為shiro-realm.ini執(zhí)行流12securityManagerModularRealmAuthorizer3ModularRealmAuthorizerrealm4ModularRealmAuthorizerpermissionResolvershiro與項目集成開shirospringweb項目整shiro與springweb項目整合在“基于url實現(xiàn)的工程”基礎(chǔ)上整合,基于url1、shirospring整合2shiroweb去掉springmvc.xml中配置的LoginInterceptor和PermissionInterceptor器shirojarweb.xmlshiroshirofilter 設(shè)置true由servlet容器控制filter設(shè)置spring容器filter的beanid,如果不設(shè)置則找與filter-name一致 Shiro的Web<bean<propertyname="securityManager"ref="securityManager"loginUrl認(rèn)證提交地址,如果沒有認(rèn)證將會請求此地址進(jìn)行認(rèn)證,請求此地址將由formAuthenticationFilter進(jìn)行表單認(rèn)證--><propertyname="loginUrl"value="/login.action"<propertyname="unauthorizedUrl"value="/refuse.jsp"過慮器鏈定義,從上向下順序執(zhí)行,一般將/**<property<!--退 ,請求logout.action執(zhí)行退出操作--/logout.action=<!--無 頁面--/refuse.jsp=<!--roles[XX]表示有XX角色才 /item/list.action=/js/**/images/**/styles/** .jsp/item/*<!--user表 認(rèn)證通過或通過記住我認(rèn)證通過的可/**=<beanid="securityManager"<propertyname="realm"ref="userRealm"realm<beanid="userRealm"的話會自動尋找項目web項目的根 自定此realm先不從數(shù)據(jù)庫查詢權(quán)限數(shù)據(jù),當(dāng)前需要先將shirorealmpublicpublicclassCustomRealm1extendsAuthorizingRealmpublicStringgetName()return}支持什么類型的tokenpublicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{從tokenStringusername=(String)拿username//如果查詢不到則返回if(!username.equals("zhangreturn}Stringpassword"123"根據(jù)用戶id s=newSysPermissionsysPermission_1newSysPermission();SysPermissionsysPermission_2newSysPermission();ActiveUseractiveUser=newActiveUser(); 返回認(rèn)證信息由父類AuthenticatingRealmSimpleAuthenticationInfosimpleAuthenticationInfo=activeUser,password,return}protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ActiveUseractiveUser=(ActiveUser)Stringuserid=根據(jù)用戶id List<String>permissions=newArrayList<String>();將權(quán)限信息封閉為SimpleAuthorizationInfosimpleAuthorizationInfo=forfor(Stringpermission:permissions){}return}}登publicStringloginsubmit(Modelmodel,HttpServletRequestthrowsExceptionshiro在認(rèn)證過程中出現(xiàn)錯誤后將異常類路徑通過request返回StringexceptionClassName=(String)request(UnknownAccountException.class.getName().equals(exceptionClassName))thrownewCustomException("賬號不存在}else exceptionClassName))thrownewCustomException("用戶名 錯誤elseif("randomCodeError".equals(exceptionClassName)){thrownewCustomException(" }thrownewException();//}}return}首數(shù)據(jù)通過model到頁面。publicStringfirst(Modelmodel)throwsSubjectsubject=ActiveUseractiveUser=(ActiveUser)subject.getPrincipal();model.addAttribute("activeUser",activeUser);return}退,請求logout.action/logout.action=無權(quán)當(dāng)用戶無操作權(quán)限,shiro將跳轉(zhuǎn)到refuse.jsp頁面shiro過慮器總過濾器簡 對應(yīng)的java anon:例子/admins/**=anon沒有參數(shù),表示可以使用authc:例如/admins/user/**=authc表示需要認(rèn)證(登錄)才能使用,F(xiàn)ormAuthenticationFilter是admins/user/**=n],admins/user/**="admin,guet"],l()方法。isPermitedAll()方法。rest:例子/admins/user/**=rest[user],根據(jù)請求的方法,相當(dāng)于/admins/user/**=perms[user:method]methodpost,get,deleteport:例子/admins/user/**=port[8081],url的端口不是8081schemal://serverName:8081?queryString,salhttphttps等,serverName是你的host,8081是url配置里port的端口,queryString是你的url里的?后面的參數(shù)authcBasic:例如/admins/user/**=authcBasichttpBasicssl:例子/admins/user/**=sslurluser:例如/admins/user/**=user沒有參數(shù)表示必須存在用戶,認(rèn)證通過或通過記住我認(rèn)證通過的可以,當(dāng)?shù)侨氩僮鲿r不做檢查anon,authcBasic,auchc,userperms,roles,ssl,rest,port是過濾認(rèn)添加憑證匹配md5加密校驗。applicationContext-shiro.xml:<bean<propertyname="hashAlgorithmName"value="md5"<property tions"value="1"realm<beanid="userRealm"<propertyname="credentialsMatcher"ref="credentialsMatcher"realm認(rèn)證方修改realm代碼從數(shù)據(jù)庫中查詢用戶,將sysService注入realmpublicpublicclassCustomRealm1extendsAuthorizingRealmprivateSysServicepublicStringgetName()return}支持什么類型的tokenpublicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{從tokenStringusercode=(String)SysUsersysUser=null;try{sysUser=}catch(Exceptione)//TODOAuto-generatedcatchblock}if(sysUser==null)return}//根據(jù)用戶id取出菜單 s=null;try{s= }catch(Exceptione)//TODOAuto-generatedcatchblock}Stringpassword=Stringsalt=ActiveUseractiveUser=newActiveUser(); SimpleAuthenticationInfosimpleAuthenticationInfo=activeUser,password,returnreturn}}8.3修改realm方realmsysServicerealmpublicpublicclassCustomRealm1extendsAuthorizingRealmprivateSysServicepublicStringgetName()return}支持什么類型的tokenpublicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ActiveUseractiveUser=(ActiveUser)Stringuserid=List<SysPermission>permissions=null;try{permissions=}catch(Exceptione)//TODOAuto-generatedcatchblock} 信SimpleAuthorizationInfosimpleAuthorizationInfo=for(SysPermission}return}}controller開啟springmvc.xmlshirocontrollershiro開啟aop開啟shiro<propertyname="securityManager"ref="securityManager"權(quán)限注解控商品查詢controller方法添限(item:querypublicModelAndViewqueryItem()throwsException同理,商品修改controller方法添限(item:update(value=(value=publicStringeditItem(@RequestParam(value="id",required=true)Integerid,Modelmodel)throwsExceptionpublicStringeditItemSubmit(@ModelAttribute("item")Itemsitems,BindingResultresult,MultipartFilepictureFile,Modelthrowsjsp控介Jsp<%@tagliburi=""prefix="shiro"名 條件(均是顯示內(nèi)容 登錄之 不在登錄狀態(tài) 用戶在沒有RememberMe 用戶在RememberMe<shiro:hasAnyRolesname="abc,123" 在有abc或者123角色<shiro:hasRole 擁有角色<shiro:lacksRole 沒有角色<shiro:hasPermission 擁有權(quán)限資源<shiro:lacksPermission 沒有abc權(quán)限資 顯示用戶名<shiro:principal 顯示用戶中的屬性jsp<shiro:hasPermission<shiro:hasPermissionhref="${pageContext.request.contextPath/item/editItem.action?id=${ite緩shiro每次都會通過realm獲取權(quán)限信息為了提高速度需要添加緩存第一次從realm中權(quán)限數(shù)據(jù)之后不再這里Shiro和EhcacheEhcachejarapplicationContext-shiro.xml<beanid="securityManager"<propertyname="realm"ref="userRealm"<propertyname="cacheManager"<beanid="cacheManager"<propertyname="cacheManagerConfigFile"value="classpath:shiro-shiro-<<ehcache 地 <diskStorepath="F:\develop\ehcache" 清空緩當(dāng)用戶權(quán)限修改后,用戶再次登陸shiro會自動調(diào)用realm從數(shù)據(jù)庫獲取權(quán)限數(shù)據(jù)如果在修改權(quán)限后想立即清除緩存則可以調(diào)用realm的clearCacherealmclearCachedpublicvoidclearCached(){PrincipalCollectionprincipals=}realmrealmclearCachedsession管<beanid="securityManager"<beanid="securityManager"<propertyname="
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年施工項目部《春節(jié)節(jié)后復(fù)工復(fù)產(chǎn)》工作專項方案 (3份)
- 小學(xué)數(shù)學(xué)四年級上冊《你知道嗎-加法交換律和交換律》知識要點
- 小學(xué)四年級數(shù)學(xué)上冊全冊錯題集練習(xí)試題第三單元 混合運算
- 小學(xué)數(shù)學(xué)二年級加減法練習(xí)題
- 揚州會議高考語文閱讀理解
- 高考語文試題分類匯編語句銜接
- 人力資源管理在酒店行業(yè)的應(yīng)用
- 金融投資行業(yè)顧問心得分享
- 在變化中尋找機(jī)遇的方法計劃
- 班主任工作培訓(xùn)總結(jié)加強教學(xué)管理及學(xué)科指導(dǎo)
- 二十五項反措檢查表優(yōu)質(zhì)資料
- 保密辦主任工作總結(jié)保密辦主任工作總結(jié)八篇
- 新生兒沐浴及撫觸護(hù)理
- 機(jī)械原理課程設(shè)計-壓床機(jī)構(gòu)的設(shè)計
- 教學(xué)案例 英語教學(xué)案例 市賽一等獎
- 四川省2023職教高考英語試題
- JJG 913-2015浮標(biāo)式氧氣吸入器
- GB/T 12190-2006電磁屏蔽室屏蔽效能的測量方法
- 2020年貴州專升本高等數(shù)學(xué)真題及答案
- 數(shù)學(xué)思想與方法期末考試范圍答案全
- 調(diào)研報告:加強市屬國有企業(yè)內(nèi)部審計工作現(xiàn)狀、存在的問題及對策建議
評論
0/150
提交評論