Apache Shiro 使用手冊.docx_第1頁
Apache Shiro 使用手冊.docx_第2頁
Apache Shiro 使用手冊.docx_第3頁
Apache Shiro 使用手冊.docx_第4頁
Apache Shiro 使用手冊.docx_第5頁
已閱讀5頁,還剩17頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領

文檔簡介

Apache Shiro 使用手冊 Shiro架構介紹一、什么是ShiroApache Shiro是一個強大易用的Java安全框架,提供了認證、授權、加密和會話管理等功能: 認證 - 用戶身份識別,常被稱為用戶“登錄”; 授權 - 訪問控制; 密碼加密 - 保護或隱藏數(shù)據(jù)防止被偷窺; 會話管理 - 每用戶相關的時間敏感的狀態(tài)。對于任何一個應用程序,Shiro都可以提供全面的安全管理服務。并且相對于其他安全框架,Shiro要簡單的多。二、Shiro的架構介紹首先,來了解一下Shiro的三個核心組件:Subject, SecurityManager 和 Realms. 如下圖:Subject:即“當前操作用戶”。但是,在Shiro中,Subject這一概念并不僅僅指人,也可以是第三方進程、后臺帳戶(Daemon Account)或其他類似事物。它僅僅意味著“當前跟軟件交互的東西”。但考慮到大多數(shù)目的和用途,你可以把它認為是Shiro的“用戶”概念。Subject代表了當前用戶的安全操作,SecurityManager則管理所有用戶的安全操作。SecurityManager:它是Shiro框架的核心,典型的Facade模式,Shiro通過SecurityManager來管理內(nèi)部組件實例,并通過它來提供安全管理的各種服務。Realm: Realm充當了Shiro與應用安全數(shù)據(jù)間的“橋梁”或者“連接器”。也就是說,當對用戶執(zhí)行認證(登錄)和授權(訪問控制)驗證時,Shiro會從應用配置的Realm中查找用戶及其權限信息。從這個意義上講,Realm實質(zhì)上是一個安全相關的DAO:它封裝了數(shù)據(jù)源的連接細節(jié),并在需要時將相關數(shù)據(jù)提供給Shiro。當配置Shiro時,你必須至少指定一個Realm,用于認證和(或)授權。配置多個Realm是可以的,但是至少需要一個。Shiro內(nèi)置了可以連接大量安全數(shù)據(jù)源(又名目錄)的Realm,如LDAP、關系數(shù)據(jù)庫(JDBC)、類似INI的文本配置資源以及屬性文件等。如果缺省的Realm不能滿足需求,你還可以插入代表自定義數(shù)據(jù)源的自己的Realm實現(xiàn)。Shiro完整架構圖:除前文所講Subject、SecurityManager 、Realm三個核心組件外,Shiro主要組件還包括:Authenticator :認證就是核實用戶身份的過程。這個過程的常見例子是大家都熟悉的“用戶/密碼”組合。多數(shù)用戶在登錄軟件系統(tǒng)時,通常提供自己的用戶名(當事人)和支持他們的密碼(證書)。如果存儲在系統(tǒng)中的密碼(或密碼表示)與用戶提供的匹配,他們就被認為通過認證。Authorizer :授權實質(zhì)上就是訪問控制 - 控制用戶能夠訪問應用中的哪些內(nèi)容,比如資源、Web頁面等等。SessionManager :在安全框架領域,Apache Shiro提供了一些獨特的東西:可在任何應用或架構層一致地使用Session API。即,Shiro為任何應用提供了一個會話編程范式 - 從小型后臺獨立應用到大型集群Web應用。這意味著,那些希望使用會話的應用開發(fā)者,不必被迫使用Servlet或EJB容器了?;蛘?,如果正在使用這些容器,開發(fā)者現(xiàn)在也可以選擇使用在任何層統(tǒng)一一致的會話API,取代Servlet或EJB機制。CacheManager :對Shiro的其他組件提供緩存支持。 Shiro 認證認證就是驗證用戶身份的過程。在認證過程中,用戶需要提交實體信息(Principals)和憑據(jù)信息(Credentials)以檢驗用戶是否合法。最常見的“實體/憑證”組合便是“用戶名/密碼”組合。一、Shiro認證過程1、收集實體/憑據(jù)信息Java代碼1. /Exampleusingmostcommonscenarioofusername/passwordpair:2. UsernamePasswordTokentoken=newUsernamePasswordToken(username,password);3. /”RememberMe”built-in:4. token.setRememberMe(true);UsernamePasswordToken支持最常見的用戶名/密碼的認證機制。同時,由于它實現(xiàn)了RememberMeAuthenticationToken接口,我們可以通過令牌設置“記住我”的功能。但是,“已記住”和“已認證”是有區(qū)別的:已記住的用戶僅僅是非匿名用戶,你可以通過subject.getPrincipals()獲取用戶信息。但是它并非是完全認證通過的用戶,當你訪問需要認證用戶的功能時,你仍然需要重新提交認證信息。這一區(qū)別可以參考亞馬遜網(wǎng)站,網(wǎng)站會默認記住登錄的用戶,再次訪問網(wǎng)站時,對于非敏感的頁面功能,頁面上會顯示記住的用戶信息,但是當你訪問網(wǎng)站賬戶信息時仍然需要再次進行登錄認證。2、提交實體/憑據(jù)信息Java代碼1. SubjectcurrentUser=SecurityUtils.getSubject();2. currentUser.login(token);收集了實體/憑據(jù)信息之后,我們可以通過SecurityUtils工具類,獲取當前的用戶,然后通過調(diào)用login方法提交認證。3、認證處理Java代碼1. try2. currentUser.login(token);3. catch(UnknownAccountExceptionuae).4. catch(IncorrectCredentialsExceptionice).5. catch(LockedAccountExceptionlae).6. catch(ExcessiveAttemptsExceptioneae).7. .catchyourown.8. catch(AuthenticationExceptionae)9. /unexpectederror?10. 如果login方法執(zhí)行完畢且沒有拋出任何異常信息,那么便認為用戶認證通過。之后在應用程序任意地方調(diào)用SecurityUtils.getSubject() 都可以獲取到當前認證通過的用戶實例,使用subject.isAuthenticated()判斷用戶是否已驗證都將返回true.相反,如果login方法執(zhí)行過程中拋出異常,那么將認為認證失敗。Shiro有著豐富的層次鮮明的異常類來描述認證失敗的原因,如代碼示例。二、登出操作登出操作可以通過調(diào)用subject.logout()來刪除你的登錄信息,如:Java代碼1. currentUser.logout();/removesallidentifyinginformationandinvalidatestheirsessiontoo.當執(zhí)行完登出操作后,Session信息將被清空,subject將被視作為匿名用戶。三、認證內(nèi)部處理機制以上,是Shiro認證在應用程序中的處理過程,下面將詳細解說Shiro認證的內(nèi)部處理機制。如上圖,我們通過Shiro架構圖的認證部分,來說明Shiro認證內(nèi)部的處理順序:1、應用程序構建了一個終端用戶認證信息的AuthenticationToken 實例后,調(diào)用Subject.login方法。2、Sbuject的實例通常是DelegatingSubject類(或子類)的實例對象,在認證開始時,會委托應用程序設置的securityManager實例調(diào)用securityManager.login(token)方法。3、SecurityManager接受到token(令牌)信息后會委托內(nèi)置的Authenticator的實例(通常都是ModularRealmAuthenticator類的實例)調(diào)用authenticator.authenticate(token). ModularRealmAuthenticator在認證過程中會對設置的一個或多個Realm實例進行適配,它實際上為Shiro提供了一個可拔插的認證機制。4、如果在應用程序中配置了多個Realm,ModularRealmAuthenticator會根據(jù)配置的AuthenticationStrategy(認證策略)來進行多Realm的認證過程。在Realm被調(diào)用后,AuthenticationStrategy將對每一個Realm的結果作出響應。注:如果應用程序中僅配置了一個Realm,Realm將被直接調(diào)用而無需再配置認證策略。5、判斷每一個Realm是否支持提交的token,如果支持,Realm將調(diào)用getAuthenticationInfo(token); getAuthenticationInfo 方法就是實際認證處理,我們通過覆蓋Realm的doGetAuthenticationInfo方法來編寫我們自定義的認證處理。四、使用多個Realm的處理機制:1、Authenticator默認實現(xiàn)是ModularRealmAuthenticator,它既支持單一Realm也支持多個Realm。如果僅配置了一個Realm,ModularRealmAuthenticator 會直接調(diào)用該Realm處理認證信息,如果配置了多個Realm,它會根據(jù)認證策略來適配Realm,找到合適的Realm執(zhí)行認證信息。自定義Authenticator的配置:Java代碼1. main2. .3. authenticator=com.foo.bar.CustomAuthenticator4. securityManager.authenticator=$authenticator2、AuthenticationStrategy(認證策略)當應用程序配置了多個Realm時,ModularRealmAuthenticator將根據(jù)認證策略來判斷認證成功或是失敗。例如,如果只有一個Realm驗證成功,而其他Realm驗證失敗,那么這次認證是否成功呢?如果大多數(shù)的Realm驗證成功了,認證是否就認為成功呢?或者,一個Realm驗證成功后,是否還需要判斷其他Realm的結果?認證策略就是根據(jù)應用程序的需要對這些問題作出決斷。認證策略是一個無狀態(tài)的組件,在認證過程中會經(jīng)過4次的調(diào)用: 在所有Realm被調(diào)用之前 在調(diào)用Realm的getAuthenticationInfo 方法之前 在調(diào)用Realm的getAuthenticationInfo 方法之后 在所有Realm被調(diào)用之后認證策略的另外一項工作就是聚合所有Realm的結果信息封裝至一個AuthenticationInfo實例中,并將此信息返回,以此作為Subject的身份信息。Shiro有3中認證策略的具體實現(xiàn):AtLeastOneSuccessfulStrategy只要有一個(或更多)的Realm驗證成功,那么認證將被視為成功FirstSuccessfulStrategy第一個Realm驗證成功,整體認證將被視為成功,且后續(xù)Realm將被忽略AllSuccessfulStrategy所有Realm成功,認證才視為成功ModularRealmAuthenticator 內(nèi)置的認證策略默認實現(xiàn)是AtLeastOneSuccessfulStrategy 方式,因為這種方式也是被廣泛使用的一種認證策略。當然,你也可以通過配置文件定義你需要的策略,如:Java代碼1. main2. .3. authcStrategy=org.apache.shiro.authc.pam.FirstSuccessfulStrategy4. securityManager.authenticator.authenticationStrategy=$authcStrategy5. .3、Realm的順序由剛才提到的認證策略,可以看到Realm在ModularRealmAuthenticator 里面的順序?qū)φJ證是有影響的。ModularRealmAuthenticator 會讀取配置在SecurityManager里的Realm。當執(zhí)行認證是,它會遍歷Realm集合,對所有支持提交的token的Realm調(diào)用getAuthenticationInfo 。因此,如果Realm的順序?qū)δ闶褂玫恼J證策略結果有影響,那么你應該在配置文件中明確定義Realm的順序,如:Java代碼1. blahRealm=pany.blah.Realm2. .3. fooRealm=pany.foo.Realm4. .5. barRealm=pany.another.Realm6. 7. securityManager.realms=$fooRealm,$barRealm,$blahRealm Shiro 授權授權即訪問控制,它將判斷用戶在應用程序中對資源是否擁有相應的訪問權限。如,判斷一個用戶有查看頁面的權限,編輯數(shù)據(jù)的權限,擁有某一按鈕的權限,以及是否擁有打印的權限等等。一、授權的三要素授權有著三個核心元素:權限、角色和用戶。權限權限是Apache Shiro安全機制最核心的元素。它在應用程序中明確聲明了被允許的行為和表現(xiàn)。一個格式良好好的權限聲明可以清晰表達出用戶對該資源擁有的權限。大多數(shù)的資源會支持典型的CRUD操作(create,read,update,delete),但是任何操作建立在特定的資源上才是有意義的。因此,權限聲明的根本思想就是建立在資源以及操作上。而我們通過權限聲明僅僅能了解這個權限可以在應用程序中做些什么,而不能確定誰擁有此權限。于是,我們就需要在應用程序中對用戶和權限建立關聯(lián)。通常的做法就是將權限分配給某個角色,然后將這個角色關聯(lián)一個或多個用戶。權限聲明及粒度Shiro權限聲明通常是使用以冒號分隔的表達式。就像前文所講,一個權限表達式可以清晰的指定資源類型,允許的操作,可訪問的數(shù)據(jù)。同時,Shiro權限表達式支持簡單的通配符,可以更加靈活的進行權限設置。下面以實例來說明權限表達式??刹樵冇脩魯?shù)據(jù)User:view可查詢或編輯用戶數(shù)據(jù)User:view,edit可對用戶數(shù)據(jù)進行所有操作User:* 或 user可編輯id為123的用戶數(shù)據(jù)User:edit:123角色Shiro支持兩種角色模式:1、傳統(tǒng)角色:一個角色代表著一系列的操作,當需要對某一操作進行授權驗證時,只需判斷是否是該角色即可。這種角色權限相對簡單、模糊,不利于擴展。2、權限角色:一個角色擁有一個權限的集合。授權驗證時,需要判斷當前角色是否擁有該權限。這種角色權限可以對該角色進行詳細的權限描述,適合更復雜的權限設計。下面將詳細描述對兩種角色模式的授權實現(xiàn)。二、授權實現(xiàn)Shiro支持三種方式實現(xiàn)授權過程: 編碼實現(xiàn) 注解實現(xiàn) JSP Taglig實現(xiàn)1、基于編碼的授權實現(xiàn)1.1基于傳統(tǒng)角色授權實現(xiàn)當需要驗證用戶是否擁有某個角色時,可以調(diào)用Subject 實例的hasRole*方法驗證。Java代碼1. SubjectcurrentUser=SecurityUtils.getSubject();2. if(currentUser.hasRole(administrator)3. /showtheadminbutton4. else5. /dontshowthebutton?Greyitout?6. 相關驗證方法如下:Subject方法描述hasRole(String roleName)當用戶擁有指定角色時,返回truehasRoles(List roleNames)按照列表順序返回相應的一個boolean值數(shù)組hasAllRoles(Collection roleNames)如果用戶擁有所有指定角色時,返回true斷言支持Shiro還支持以斷言的方式進行授權驗證。斷言成功,不返回任何值,程序繼續(xù)執(zhí)行;斷言失敗時,將拋出異常信息。使用斷言,可以使我們的代碼更加簡潔。Java代碼1. SubjectcurrentUser=SecurityUtils.getSubject();2. /guaranteethatthecurrentuserisabanktellerand3. /thereforeallowedtoopentheaccount:4. currentUser.checkRole(bankTeller);5. openBankAccount();斷言的相關方法:Subject方法描述checkRole(String roleName)斷言用戶是否擁有指定角色checkRoles(Collection roleNames)斷言用戶是否擁有所有指定角色checkRoles(String. roleNames)對上一方法的方法重載1.2 基于權限角色授權實現(xiàn)相比傳統(tǒng)角色模式,基于權限的角色模式耦合性要更低些,它不會因角色的改變而對源代碼進行修改,因此,基于權限的角色模式是更好的訪問控制方式。它的代碼實現(xiàn)有以下幾種實現(xiàn)方式:1、基于權限對象的實現(xiàn)創(chuàng)建org.apache.shiro.authz.Permission的實例,將該實例對象作為參數(shù)傳遞給Subject.isPermitted()進行驗證。Java代碼1. PermissionprintPermission=newPrinterPermission(laserjet4400n,print);2. SubjectcurrentUser=SecurityUtils.getSubject();3. if(currentUser.isPermitted(printPermission)4. /showthePrintbutton5. else6. /dontshowthebutton?Greyitout?7. 8. PermissionprintPermission=newPrinterPermission(laserjet4400n,print);9. SubjectcurrentUser=SecurityUtils.getSubject();10. if(currentUser.isPermitted(printPermission)11. /showthePrintbutton12. else13. /dontshowthebutton?Greyitout?14. 相關方法如下:Subject方法描述isPermitted(Permission p)Subject擁有制定權限時,返回treuisPermitted(List perms)返回對應權限的boolean數(shù)組isPermittedAll(Collection perms)Subject擁有所有制定權限時,返回true2、 基于字符串的實現(xiàn)相比笨重的基于對象的實現(xiàn)方式,基于字符串的實現(xiàn)便顯得更加簡潔。Java代碼1. SubjectcurrentUser=SecurityUtils.getSubject();2. if(currentUser.isPermitted(printer:print:laserjet4400n)3. /showthePrintbutton4. else5. /dontshowthebutton?Greyitout?6. 使用冒號分隔的權限表達式是org.apache.shiro.authz.permission.WildcardPermission 默認支持的實現(xiàn)方式。這里分別代表了 資源類型:操作:資源ID類似基于對象的實現(xiàn)相關方法,基于字符串的實現(xiàn)相關方法:isPermitted(String perm)、isPermitted(String. perms)、isPermittedAll(String. perms)基于權限對象的斷言實現(xiàn)Java代碼1. SubjectcurrentUser=SecurityUtils.getSubject();2. /guaranteethatthecurrentuserispermitted3. /toopenabankaccount:4. Permissionp=newAccountPermission(open);5. currentUser.checkPermission(p);6. openBankAccount();基于字符串的斷言實現(xiàn)Java代碼1. SubjectcurrentUser=SecurityUtils.getSubject();2. /guaranteethatthecurrentuserispermitted3. /toopenabankaccount:4. currentUser.checkPermission(account:open);5. openBankAccount();斷言實現(xiàn)的相關方法Subject方法說明checkPermission(Permission p)斷言用戶是否擁有制定權限checkPermission(String perm)斷言用戶是否擁有制定權限checkPermissions(Collection perms)斷言用戶是否擁有所有指定權限checkPermissions(String. perms)斷言用戶是否擁有所有指定權限2、基于注解的授權實現(xiàn)Shiro注解支持AspectJ、Spring、Google-Guice等,可根據(jù)應用進行不同的配置。相關的注解: RequiresAuthentication可以用戶類/屬性/方法,用于表明當前用戶需是經(jīng)過認證的用戶。Java代碼1. RequiresAuthentication2. publicvoidupdateAccount(AccountuserAccount)3. /thismethodwillonlybeinvokedbya4. /Subjectthatisguaranteedauthenticated5. .6. RequiresGuest表明該用戶需為”guest”用戶 RequiresPermissions當前用戶需擁有制定權限Java代碼1. RequiresPermissions(account:create)2. publicvoidcreateAccount(Accountaccount)3. /thismethodwillonlybeinvokedbyaSubject4. /thatispermittedtocreateanaccount5. .6. RequiresRoles當前用戶需擁有制定角色 RequiresUser當前用戶需為已認證用戶或已記住用戶3、基于JSP TAG的授權實現(xiàn)Shiro提供了一套JSP標簽庫來實現(xiàn)頁面級的授權控制。在使用Shiro標簽庫前,首先需要在JSP引入shiro標簽:Java代碼1. 下面一一介紹Shiro的標簽:guest標簽驗證當前用戶是否為“訪客”,即未認證(包含未記?。┑挠脩鬤ml代碼1. 2. Hithere!PleaseLoginorSignuptoday!3. user標簽認證通過或已記住的用戶Xml代碼1. 2. WelcomebackJohn!NotJohn?Clickheretologin.3. authenticated標簽已認證通過的用戶。不包含已記住的用戶,這是與user標簽的區(qū)別所在。Xml代碼1. 2. Updateyourcontactinformation.3. notAuthenticated標簽未認證通過用戶,與authenticated標簽相對應。與guest標簽的區(qū)別是,該標簽包含已記住用戶。Xml代碼1. 2. Pleaselogininordertoupdateyourcreditcardinformation.3. principal 標簽輸出當前用戶信息,通常為登錄帳號信息Xml代碼1. Hello,howareyoutoday?hasRole標簽驗證當前用戶是否屬于該角色Xml代碼1. 2. Administerthesystem3. lacksRole標簽與hasRole標簽邏輯相反,當用戶不屬于該角色時驗證通過Xml代碼1. 2. Sorry,youarenotallowedtoadministerthesystem.3. hasAnyRole標簽驗證當前用戶是否屬于以下任意一個角色。Xml代碼1. 2. Youareeitheradeveloper,projectmanager,oradministrator.3. hasPermission標簽驗證當前用戶是否擁有制定權限Xml代碼1. 2. CreateanewUser3. lacksPermission標簽與hasPermission標簽邏輯相反,當前用戶沒有制定權限時,驗證通過Xml代碼1. 2. CreateanewUser3. 三、Shiro授權的內(nèi)部處理機制1、在應用程序中調(diào)用授權驗證方法(Subject的isPermitted*或hasRole*等)2、Sbuject的實例通常是DelegatingSubject類(或子類)的實例對象,在認證開始時,會委托應用程序設置的securityManager實例調(diào)用相應的isPermitted*或hasRole*方法。3、接下來SecurityManager會委托內(nèi)置的Authorizer的實例(默認是ModularRealmAuthorizer 類的實例,類似認證實例,它同樣支持一個或多個Realm實例認證)調(diào)用相應的授權方法。4、每一個Realm將檢查是否實現(xiàn)了相同的 Authorizer 接口。然后,將調(diào)用Reaml自己的相應的授權驗證方法。當使用多個Realm時,不同于認證策略處理方式,授權處理過程中:1、當調(diào)用Realm出現(xiàn)異常時,將立即拋出異常,結束授權驗證。2、只要有一個Realm驗證成功,那么將認為授權成功,立即返回,結束認證。 Realm 實現(xiàn)在認證、授權內(nèi)部實現(xiàn)機制中都有提到,最終處理都將交給Real進行處理。因為在Shiro中,最終是通過Realm來獲取應用程序中的用戶、角色及權限信息的。通常情況下,在Realm中會直接從我們的數(shù)據(jù)源中獲取Shiro需要的驗證信息??梢哉f,Realm是專用于安全框架的DAO.一、認證實現(xiàn)正如前文所提到的,Shiro的認證過程最終會交由Realm執(zhí)行,這時會調(diào)用Realm的getAuthenticationInfo(token)方法。該方法主要執(zhí)行以下操作:1、檢查提交的進行認證的令牌信息2、根據(jù)令牌信息從數(shù)據(jù)源(通常為數(shù)據(jù)庫)中獲取用戶信息3、對用戶信息進行匹配驗證。4、驗證通過將返回一個封裝了用戶信息的AuthenticationInfo實例。5、驗證失敗則拋出AuthenticationException異常信息。而在我們的應用程序中要做的就是自定義一個Realm類,繼承AuthorizingRealm抽象類,重載doGetAuthenticationInfo (),重寫獲取用戶信息的方法。Java代碼1. protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokenauthcToken)throwsAuthenticationException2. UsernamePasswordTokentoken=(UsernamePasswordToken)authcToken;3. Useruser=accountManager.findUserByUserName(token.getUsername();4. if(user!=null)5. returnnewSimpleAuthenticationInfo(user.getUserName(),user.getPassword(),getName();6. else7. returnnull;8. 9. 二、授權實現(xiàn)而授權實現(xiàn)則與認證實現(xiàn)非常相似,在我們自定義的Realm中,重載doGetAuthorizationInfo()方法,重寫獲取用戶權限的方法即可。Java代碼1. protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals)2. StringuserName=(String)principals.fromRealm(getName().iterator().next();3. Useruser=accountManager.findUserByUserName(userName);4. if(user!=null)5. SimpleAuthorizationInfoinfo=newSimpleAuthorizationInfo();6. for(Groupgroup:user.getGroupList()7. info.addStringPermissions(group.getPermissionList();8. 9. returninfo;10. else11. returnnull;12. 13. Shiro 配置說明Apache Shiro的配置主要分為四部分: 對象和屬性的定義與配置 URL的過濾器配置 靜態(tài)用戶配置 靜態(tài)角色配置其中,由于用戶、角色一般由后臺進行操作的動態(tài)數(shù)據(jù),因此Shiro配置一般僅包含前兩項的配置。Apache Shiro的大多數(shù)組件是基于POJO的,因此我們可以使用POJO兼容的任何配置機制進行配置,例如:Java代碼、Sping XML、YAML、JSON、ini文件等等。下面,以Spring XML的配置方式為例,并且對其中的一些配置參數(shù)進行一些簡單說明。Shiro對象的配置:主要是對Shiro各個組件的實現(xiàn)進行定義配置,主要組件在前文已

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
  • 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論