框架學習-1套第二天dayshiro教案_第1頁
框架學習-1套第二天dayshiro教案_第2頁
框架學習-1套第二天dayshiro教案_第3頁
框架學習-1套第二天dayshiro教案_第4頁
框架學習-1套第二天dayshiro教案_第5頁
已閱讀5頁,還剩48頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

課程目5、掌握Shiro進行的常用方法權(quán)限管管理實現(xiàn)對用戶系統(tǒng)的控制按照安全規(guī)則或者安全策略控制用戶可以而且只能訪戶首先經(jīng)過認證,認證通過后用戶具有該資源的權(quán)限方可。用戶認是系統(tǒng)通過核對用戶輸入的用戶名和口令看其是否與系統(tǒng)中的該用戶的用戶名和口令用戶名認證流是否允 問

YES用戶是否用戶是否認通過進行用 認YES繼

是否認證通過

NO續(xù)認箱地址等,一個主體可以有多個,但是必須有一個主(PrimaryPrincipal 等問系統(tǒng)的資源,對于某些資源沒限是無法的。權(quán)限控認分權(quán)限控認分配權(quán)NO系統(tǒng)資繼繼有意義,如用戶查詢權(quán)限、用戶添限、某個類方法的調(diào)用權(quán)限、編號為001用戶的修改權(quán)限等,通過權(quán)限可知主體對哪些資源都有哪些操作。主主(用戶權(quán)(查詢權(quán)(添加權(quán)(刪除權(quán)類型商品資(商品信息資主體(賬號、)********用角權(quán)1111****用角1資*****1111****基于角色的控,RBAC基于角色的控制(Role-BasedAccessControl)是以角色為中心進行控制,比如:主體的角色為總經(jīng)理可以查詢企業(yè)運營報表,查詢員工工資信息等控制流程如,YESYES查詢工資信無無處(通常提示用戶無權(quán)操作}if(主體.hasRole("總經(jīng)理角色id")|| }基于資源的控RBAC基于資源的控制(Resource-BasedAccessControl)是以資源為中心進行}權(quán)限管理解決方service接口添加校驗實現(xiàn),service接口需要傳入當前操作人的標識,與商品信息創(chuàng)建人標識對比,不一url基于url是企業(yè)中常用的權(quán)限管理方法,實現(xiàn)思路是:將系統(tǒng)操作的每個url配置在權(quán)限表中,將權(quán)限對應到角色,將角色分配給用戶,用戶系統(tǒng)功能通過Filter進行過慮過慮器獲取到用戶的url,只要的url是用戶分配角色中的url則放行繼續(xù)。系系統(tǒng)的資 認證通過將用戶認證通過將用戶 權(quán)限url記錄到 Url是否公開地( 地Url是否公開地( 地址是否存在url是否公開地Url是否是公地址(只 認 是否存在權(quán)限url獲 過慮獲 提示無權(quán)操放行繼放行繼放行繼放行繼NO進行用 認省系統(tǒng)開發(fā)時間,并且權(quán)限管理框架提供了完善的認證和功能有利于系統(tǒng)擴展,但基于url實web系統(tǒng)框架:springmvc3.2.0+mybatis3.2.7(springmvc教案)UI:jqueryeasyUI1.2.2mysql5.1導入,先導入shiro_sql_talbe.sql再導入shiro-sql_table_data.sqlactiveUser用戶publicpublicclassActiveUserimplementsjava.io.SerializableprivateStringuserid;//用戶idprivateStringusercode;/用戶賬號privateStringusername;/privatesprivateList<SysPermissionpermissions用戶認證使用springmvc器對用戶認證進行如果用戶沒有登陸則跳轉(zhuǎn)到登陸頁面,filter實現(xiàn)。publicpublicclassLoginInterceptorimplementsHandlerInterceptor在進入controllerpublicbooleanpreHandle(HttpServletRequest{)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進行如果用戶的url沒有分配權(quán)限則跳轉(zhuǎn)到無權(quán)操作提示頁面(refuse.jspfilter實現(xiàn)。publicpublicclassPermissionInterceptorimplementsHandlerInterceptor在進入controller進入actionpublicbooleanpreHandle(HttpServletRequestrequest,HttpServletResponseresponse,Objecthandler)throwsException{//TODOAuto-generatedmethod//用 Stringurl=)List<String>open_urls=//用 的for(Stringopen_url:open_urls)if(url.indexOf(open_url)>=0)//如 的是公開地址則放return}}//從session獲取用戶公 List<String>common_urls=//用 的for(Stringcommon_url:common_urls)if(url.indexOf(common_url)>=0)//如 return}}}HttpSessionsession=request.getSession();ActiveUseractiveUser=(ActiveUser)取出session中權(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)throwsString 錯thrownew } 認ActiveUseractiveUser=sysService.authenticat(usercode,session.setAttribute("activeUser"activeUser);return}service**Title:@param@param@returnActiveUser@throwspublicActiveUserauthenticat(Stringusercode,Stringthrows根據(jù)用戶idpublicList<SysPermission>findSysPermissionList(Stringthrows shiro介shiro。shiro。ShiroSubjectsubject進行交互,subject記錄了當前操作用戶,將用戶的SubjectshirosubjectsubjectSecurityManagerSecurityManager即安全管理器,對全部的subject進行安全管理,它是shiro的,subjectSecurityManagersubject的認證、等,實質(zhì)上SecurityManager是通過Authenticator進行認證,通過Authorizer進行,通SessionManager進行會話管理等。,Authenticator即認證器,對用戶進行認證,Authenticator是一個接口,shiro提供Authorizer即器,用戶通過認證器認證通過,在功能時需要通過器判斷用securityManger注意:realm理解成只是從數(shù)據(jù)源取數(shù)據(jù),在realm中還有認證校驗的相關(guān)shiroweb應用上,也可以將分布式應用的會話集中在一點管理,此特性可以通過jdbc將會話到數(shù)據(jù)庫。Cryptography即管理,shiro提供了一套加密/的組件,方便開發(fā)。比如提供shirojarjavashirojarshiro提供的功能了。shiro-core是包必須選用還提供了與web整合的shiro-web與spring整合的shiro-spring、quartzshiro-quartzshirojarmaven坐標。參考 shiro認構(gòu)構(gòu)造SecurityManager環(huán)提交認執(zhí)行認執(zhí)行認根 獲取驗證信入門程序(用戶登陸和退出javajdk版本:1.7.0_72shiro-coreJpertieslog4j.rootLogger=debug,Shiro.iniSecurityManager環(huán)境。配置eclipseini文件編輯:在eclipse配置后,在classpath創(chuàng)建shiro.ini配置文件,為了方便測試將用戶名和配置shiro.ini配置文件中:publicvoidtestLoginLogout()構(gòu)建SecurityManager工廠,IniSecurityManagerFactory可以從ini文件Factory<SecurityManager>factory=newIniSecurityManagerFactory(通過工廠創(chuàng)建SecurityManagersecurityManager=////Subjectsubject=UsernamePasswordTokentoken=newtry}catch(AuthenticationExceptione)//TODOAuto-generatedcatchblock}BooleanisAuthenticated=System.out.println("用戶認證狀態(tài):isAuthenticated=System.out.println("用戶認證狀態(tài):}3AuthenticatorModularRealmAuthenticatorrealmini配置文件取用戶真實的賬號和,這里使用的是IniRealm(shiro自帶)4IniRealm先根據(jù)token中的賬號去ini中找該賬號,如果找不到則給org.apache.shiro.authc.UnknownAccountExceptionNoaccountfoundfor.apache.shiro.authc.IncorrectCredentialsException:Submitted rememberMe=false]didnotmatchtheexpectedcredentials.上邊的程序使用的是Shiro自帶的IniRealmIniRealm從ini配置文件中用戶的信息,大部分情況下需要從系統(tǒng)的數(shù)據(jù)庫中用戶信息,所以需要自定義realm。shiro最基礎(chǔ)的是Realm接口,CachingRealm負責緩存處理,AuthenticationRealmpublicpublicclassCustomRealm1extendsAuthorizingRealmpublicStringgetName()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)容散列算法常用于對進行散列常用的散列算法有MD5SHA。一般散列算法需要提供一個salt(鹽)與原始內(nèi)容生成信息,這樣做的目的是為了安全性,比如:111111的md5值是:96e eb72c92a549dd5a330112,拿著 eb72c92a549dd5a330112”去md5很容易進行,如果要是對111111和salt(鹽,一個隨機數(shù))進行散列,這樣雖然都是111111加不同的鹽會生成Stringpassword_md5newMd5Hash("111111").toString();Stringpassword_md5_sale_1=newMd5Hash("111111","eteokues",Stringpassword_md5_sale_2=newMd5Hash("111111","uiwueylm",StringsimpleHash=newSimpleHash("MD5","111111",realmrealm從數(shù)據(jù)庫取出鹽和加密后的值由shiro完成校驗。自定義protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{Stringusername=(String)是Stringpassword=Stringsalt="eteokues";SimpleAuthenticationInfosimpleAuthenticationInfo=username,password,return}realm配. 測試代shiro執(zhí)根根獲取資源權(quán)限信執(zhí)Shiro支持三種方式的編程式:通過寫if/else代碼塊完成Subjectsubject=//}else//}publicvoido(){//}JSP/GSP:在JSP/GSP頁面通過相應的完成<!—限—本序測試使用第一種編程方式,實際與web系統(tǒng)集成使用后兩種方式 在ini文件中用戶、角色、權(quán)限的配置規(guī)則是“用戶名=,角色1,角色2...”“角色=12...:”是資源用戶實例001的所限:user:*:001 publicvoidtestPermission()//Factory<SecurityManager>factory=newIniSecurityManagerFactory(創(chuàng)建SecurityManagersecurityManager=將securityManagerSubjectsubject=

//設(shè)置用戶認證的 UsernamePasswordTokentoken=newUsernamePasswordToken("zhang",try}catch(AuthenticationExceptione)//TODOAuto-generatedcatchblock}BooleanisAuthenticated=System.out.println("用戶認證狀態(tài)://用 檢測基于角System.out.println("用戶是否擁有一個角色:System.out.println("用戶是否擁有多個角色:"+subject.hasAllRoles(Arrays.asList("role1""role2"))); //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"))); System.out.println("是否擁有某一個權(quán)限:System.out.println("是 subject.isPermittedAll("user:create:1","user:delete"));check realmrealmdoGetAuthorizationInfo方法,此方法需要完成:根據(jù)用戶從數(shù)據(jù)庫查詢權(quán)限字符串,由shiro進行。protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){Stringusername=(String)//根 List<String>permissions=newArrayList<String>();SimpleAuthorizationInfosimpleAuthorizationInfonewfor(Stringpermission:permissions){}return}2securityManager通過ModularRealmAuthorizershiro與項目集成開shirospringwebshiro與springweb項目整合在“基于url實現(xiàn)的工程”基礎(chǔ)上整合,基于url1、shirospring整合2shiroweb取消原springmvc認證和去掉springmvc.xml中配置的LoginInterceptor和PermissionInterceptor器shirojarweb.xmlshiro filter設(shè)置true由servlet容器控制filter設(shè)置spring容器filter的beanid,如果不設(shè)置則找與filter-name一致 Shiro的Web<bean<propertyname="securityManager"ref="securityManager"loginUrl認證提交地址,如果沒有認證將會請求此地址進行認證,請求此地址將由formAuthenticationFilter進行表單認證--><propertyname="loginUrl"value="/login.action"<propertyname="unauthorizedUrl"value="/refuse.jsp"<property<!--退 /logout.action=<!--無 頁面--/refuse.jsp=<!--roles[XX]表示有XX角色才 /item/list.action=/js/**/images/**/styles/** .jsp/item/*<!--user表 /**=<beanid="securityManager"<propertyname="realm"ref="userRealm"realm<beanid="userRealm"址的話會自動尋找項目web項目的根 publicpublicclassCustomRealm1extendsAuthorizingRealmpublicStringgetName()return}支持什么類型的tokenpublicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthenticationInfodoGetAuthenticationInfo(AuthenticationTokentoken)throwsAuthenticationException{從tokenStringusername=(String)拿username//如果查詢不到則返回if(!username.equals("zhang"return}Stringpassword"123";/根據(jù)用戶id s=newSysPermissionsysPermission_1=newSysPermissionsysPermission_2newSysPermission();ActiveUseractiveUser=newActiveUser(); //SimpleAuthenticationInfosimpleAuthenticationInfo=activeUser,password,return}protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ActiveUseractiveUser=(ActiveUser)Stringuserid=// List<String>permissions=newArrayList<String>();將權(quán)限信息封閉為SimpleAuthorizationInfosimpleAuthorizationInfo=for(Stringpermission:permissions)}return}}publicStringloginsubmit(Modelmodel,HttpServletRequestthrowsExceptionshiro在認證過程中出現(xiàn)錯誤后將異常類路徑通過request返回StringexceptionClassName=(String)requestthrownewCustomException("賬號不存在}elseexceptionClassName))thrownewCustomException("用戶名 錯誤elseif("randomCodeError".equals(exceptionClassName)){thrownewCustomException(" }thrownewException();//}}return}sessionshirocontrollersessionmodelpublicStringfirst(Modelmodel)throwsSubjectsubject=ActiveUseractiveUser=(ActiveUser)subject.getPrincipal();model.addAttribute("activeUser",activeUser);return}shirosessionManager,shirologout執(zhí)行退出操作/logout.action=shiro過濾器簡 對應的java anon:例子/admins/**=anon沒有參數(shù),表示可以使用authc:例如/admins/user/**=authc表示需要認證(登錄)才能使用,F(xiàn)ormAuthenticationFilter是hasAllRoles()方法。isPermitedAll()方法。rest:例子/admins/user/**=rest[user],根據(jù)請求的方法,相當于],port:例子/admins/user/**=port[8081當請求的url的端口不是8081是跳轉(zhuǎn)到schemal://serverName:8081?queryString,salhttphttps等,serverName是你的host,8081是url配置里port的端口,queryString是你的url里的?后面的參數(shù)user:例如/admins/user/**=user沒有參數(shù)表示必須存在用戶,認證通過或通過記住我認證通過的可以,當?shù)侨氩僮鲿r不做檢查md5加密校驗。applicationContext-shiro.xml:<bean<propertyname="hashAlgorithmName"value="md5"<propertyname="hashIterations"value="1"realm<beanid="userRealm"<propertyname="credentialsMatcher"ref="credentialsMatcher"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方publicpublicclassCustomRealm1extendsAuthorizingRealmprivateSysServicepublicStringgetName()return}支持什么類型的tokenpublicbooleansupports(AuthenticationTokentoken)returntokeninstanceof}protectedAuthorizationInfodoGetAuthorizationInfo(PrincipalCollectionprincipals){ActiveUseractiveUser=(ActiveUser)Stringuserid=List<SysPermission>permissions=null;try{permissions=}catch(Exceptione)//TODOAuto-generatedcatchblock} 信SimpleAuthorizationInfosimpleAuthorizationInfo=for(SysPermission}return}}controller開啟aop<aop:configproxy-target-開啟shiro<propertyname="securityManager"ref="securityManager"商品查詢controller方法添限(item:query:publicModelAndViewqueryItem()throwsException上邊代碼s)表示必須擁有“y”權(quán)限方可執(zhí)行。同理,商品修改controller方法添限(item:update:(value(value=publicStringeditItem(@RequestParam(value="id",required=true)Integerid,Modelmodel)throwsExceptionpublicStringeditItemSubmit(@ModelAttribute("item")Itemsitems,BindingResultresult,MultipartFilepictureFile,Modelthrowsjsp控介Jsp名 RememberMe RememberMe<shiro:hasAnyRolesname="abc,123" abc123<shiro:hasRole <shiro:lacksRole <shiro:hasPermission 擁限資源<shiro:lacksPermission abc 顯示用戶名<shiro:principal 顯示用戶中的屬性jsp頁面添加<shiro:hasPermissionhref="${pageContext.request.contextPath/item/editItem.action?id=${ite<shiro:hasPermissionhref="${pageContext.request.contextPath/item/editItem.action?id=${iteshiro每次都會通過realm獲取權(quán)限信息為了提高速度需要添加緩存第一次從realm中權(quán)限數(shù)據(jù)之后不再這里Shiro和EhcacheEhcachejar在applicationContext-shiro.xml<beanid="securityManager"<propertyname="realm"ref="userRealm"<propertyname="cacheManager"<beanid="cacheManager"<propertyname="cacheManagerConfigFile"<<ehcache 地址--<diskStorepath="F:\develop\ehcache" 當用戶權(quán)限修改后,用戶再次登陸shiro會自動調(diào)用realm從數(shù)據(jù)庫獲取權(quán)限數(shù)據(jù)如果在修改權(quán)限后想立即清除緩存則可以調(diào)用realm的clearCacherealm中定義clearCachedpublicvoidclearCached(){PrincipalCollectionprincipals=}在權(quán)限修改后調(diào)用realmrealm已經(jīng)由spring中獲取realm實例,調(diào)用clearCachedsession<beanid="securityManager"<beanid="securityManager"<propertyname="realm"ref="userRealm"<prop

溫馨提示

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

最新文檔

評論

0/150

提交評論