將Shiro作為應(yīng)用的權(quán)限基礎(chǔ)三基于注解實現(xiàn)的授權(quán)認(rèn)證過程_第1頁
將Shiro作為應(yīng)用的權(quán)限基礎(chǔ)三基于注解實現(xiàn)的授權(quán)認(rèn)證過程_第2頁
將Shiro作為應(yīng)用的權(quán)限基礎(chǔ)三基于注解實現(xiàn)的授權(quán)認(rèn)證過程_第3頁
將Shiro作為應(yīng)用的權(quán)限基礎(chǔ)三基于注解實現(xiàn)的授權(quán)認(rèn)證過程_第4頁
將Shiro作為應(yīng)用的權(quán)限基礎(chǔ)三基于注解實現(xiàn)的授權(quán)認(rèn)證過程_第5頁
已閱讀5頁,還剩5頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、授權(quán)即訪問控制,它將判斷用戶在應(yīng)用程序中對資源是否擁有相應(yīng)的訪問權(quán)限。如,判斷一個用戶有查看頁面的權(quán)限,編輯數(shù)據(jù)的權(quán)限,擁有某一按鈕的權(quán)限等等。一、用戶權(quán)限模型為實現(xiàn)一個較為靈活的用戶權(quán)限數(shù)據(jù)模型,通常把用戶信息單獨(dú)用一個實體表示,用戶權(quán)限信息用兩個實體表示。用戶信息用 LoginAccount 表示,最簡單的用戶信息可能只包含用戶名 loginName 及密碼 password 兩個屬性。實際應(yīng)用中可能會包含用戶是否被禁用,用戶信息是否過期等信息。用戶權(quán)限信息用 Role 與 Permission 表示,Role 與 Permission 之間構(gòu)成多對多關(guān)系。Permission 可以理解為

2、對一個資源的操作,Role 可以簡單理解為 Permission 的集合。用戶信息與 Role 之間構(gòu)成多對多關(guān)系。表示同一個用戶可以擁有多個 Role,一個 Role 可以被多個用戶所擁有。權(quán)限聲明及粒度Shiro權(quán)限聲明通常是使用以冒號分隔的表達(dá)式。就像前文所講,一個權(quán)限表達(dá)式可以清晰的指定資源類型,允許的操作。同時,Shiro權(quán)限表達(dá)式支持簡單的通配符,可以更加靈活的進(jìn)行權(quán)限設(shè)置。下面以實例來說明權(quán)限表達(dá)式。可查詢用戶數(shù)據(jù)User:view可查詢或編輯用戶數(shù)據(jù)User:view,edit可對用戶數(shù)據(jù)進(jìn)行所有操作User:*或 user可編輯id為123的用戶數(shù)據(jù)User:edit:123

3、授權(quán)處理過程認(rèn)證通過后接受 Shiro 授權(quán)檢查,授權(quán)驗證時,需要判斷當(dāng)前角色是否擁有該權(quán)限。只有授權(quán)通過,才可以訪問受保護(hù) URL 對應(yīng)的資源,否則跳轉(zhuǎn)到“未經(jīng)授權(quán)頁面”。如果我們自定義Realm實現(xiàn),比如我后面的例子中,自定義了ShiroDbRealm類,當(dāng)訪問被RequiresPermissions注解的方法時,會先執(zhí)行ShiroDbRealm.doGetAuthorizationInfo()進(jìn)行授權(quán)。ControllerRequestMapping(value = /user)public class UserController Resource(name=userService)p

4、rivate IUserService userService;/* * 測試權(quán)限 * 只有擁有 user:create權(quán)限,才能進(jìn)行注冊 * param user * return */RequestMapping(value = /register)ResponseBodyRequiresPermissions(user:create)public boolean register(User user)return userService.register(user);二、授權(quán)實現(xiàn)Shiro支持三種方式實現(xiàn)授權(quán)過程:o 編碼實現(xiàn)o 注解實現(xiàn)o JSP Taglig實現(xiàn)1、基于編碼的授權(quán)實現(xiàn)

5、1、基于權(quán)限對象的實現(xiàn)創(chuàng)建org.apache.shiro.authz.Permission的實例,將該實例對象作為參數(shù)傳遞給Subject.isPermitted()進(jìn)行驗證。Permission printPermission = new PrinterPermission(laserjet4400n, print); Subject currentUser = SecurityUtils.getSubject(); if (currentUser.isPermitted(printPermission) /show the Print button else /dont show the

6、 button? Grey it out? 2、基于字符串的實現(xiàn)相比笨重的基于對象的實現(xiàn)方式,基于字符串的實現(xiàn)便顯得更加簡潔。Subject currentUser = SecurityUtils.getSubject();if (currentUser.isPermitted(printer:print:laserjet4400n) /show the Print button else /dont show the button? Grey it out? 使用冒號分隔的權(quán)限表達(dá)式是org.apache.shiro.authz.permission.WildcardPermission默認(rèn)

7、支持的實現(xiàn)方式。這里分別代表了資源類型:操作:資源ID2、基于注解的授權(quán)實現(xiàn)Shiro注解支持AspectJ、Spring、Google-Guice等,可根據(jù)應(yīng)用進(jìn)行不同的配置。相關(guān)的注解:RequiresAuthentication可以用戶類/屬性/方法,用于表明當(dāng)前用戶需是經(jīng)過認(rèn)證的用戶。RequiresAuthentication public void updateAccount(Account userAccount) /this method will only be invoked by a /Subject that is guaranteed authenticated .

8、RequiresPermissions當(dāng)前用戶需擁有制定權(quán)限RequiresPermissions(account:create) public void createAccount(Account account) /this method will only be invoked by a Subject /that is permitted to create an account . 3、基于JSPTAG的授權(quán)實現(xiàn)Shiro提供了一套JSP標(biāo)簽庫來實現(xiàn)頁面級的授權(quán)控制。在使用Shiro標(biāo)簽庫前,首先需要在JSP引入shiro標(biāo)簽:hasRole標(biāo)簽: 驗證當(dāng)前用戶是否屬于該角色 Adm

9、inister the system hasPermission標(biāo)簽:驗證當(dāng)前用戶是否擁有制定權(quán)限 Create a new User 三、Shiro授權(quán)的內(nèi)部處理機(jī)制1、在應(yīng)用程序中調(diào)用授權(quán)驗證方法(Subject的isPermitted*或hasRole*等)2、Sbuject會委托應(yīng)用程序設(shè)置的securityManager實例調(diào)用相應(yīng)的isPermitted*或hasRole*方法。3、接下來SecurityManager會委托內(nèi)置的Authorizer的實例(默認(rèn)是ModularRealmAuthorizer類的實例,類似認(rèn)證實例)調(diào)用相應(yīng)的授權(quán)方法。4、每一個Realm將檢查是否實

10、現(xiàn)了相同的Authorizer 接口。然后,將調(diào)用Reaml自己的相應(yīng)的授權(quán)驗證方法。四、授權(quán)代碼UserController:處理用戶登錄后的請求(注冊)package org.shiro.demo.controller;import javax.annotation.Resource;import org.apache.shiro.authz.annotation.RequiresPermissions;import org.apache.shiro.authz.annotation.RequiresRoles;import org.springframework.stereotype.C

11、ontroller;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.ResponseBody;import org.shiro.demo.entity.User;import org.shiro.demo.service.IUserService;ControllerRequestMapping(value = /user)public class UserController Resource(name=userServic

12、e)private IUserService userService;/* * 測試權(quán)限 * 只有擁有 user:create 權(quán)限,才能進(jìn)行注冊 * param user * return */RequestMapping(value = /register)ResponseBodyRequiresPermissions(user:create)public boolean register(User user)return userService.register(user);/* * 測試角色 * 只有擁有 administrator 角色,才能跳轉(zhuǎn)到register頁面 * retur

13、n */RequestMapping(value = /toRegister)RequiresRoles(administrator)public String toRegister()return /system/user/register;ShiroDbRealm:自定義的指定Shiro驗證用戶授權(quán)的類package org.shiro.demo.service.realm;import java.util.ArrayList;import java.util.List; import javax.annotation.Resource; import mons

14、.lang.StringUtils;import org.apache.shiro.authc.AuthenticationException;import org.apache.shiro.authc.AuthenticationInfo;import org.apache.shiro.authc.AuthenticationToken;import org.apache.shiro.authc.SimpleAuthenticationInfo;import org.apache.shiro.authc.UsernamePasswordToken;import org.apache.shir

15、o.authz.AuthorizationException;import org.apache.shiro.authz.AuthorizationInfo;import org.apache.shiro.authz.SimpleAuthorizationInfo;import org.apache.shiro.realm.AuthorizingRealm;import org.apache.shiro.subject.PrincipalCollection;import org.shiro.demo.entity.Permission;import org.shiro.demo.entity

16、.Role;import org.shiro.demo.entity.User;import org.shiro.demo.service.IUserService; /* * 自定義的指定Shiro驗證用戶登錄的類 * author TCH * */public class ShiroDbRealm extends AuthorizingRealm /Resource(name=userService)private IUserService userService;public void setUserService(IUserService userService) this.userS

17、ervice= userService; /* * 為當(dāng)前登錄的Subject授予角色和權(quán)限 * see 經(jīng)測試:本例中該方法的調(diào)用時機(jī)為需授權(quán)資源被訪問時 * see經(jīng)測試:并且每次訪問需授權(quán)資源時都會執(zhí)行該方法中的邏輯,* 這表明本例未啟用AuthorizationCache * seeweb層可以有shiro的緩存,dao層可以配有hibernate的緩存(后面介紹) */protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) /獲取當(dāng)前登錄的用戶名,等價于(String)/pr

18、incipals.fromRealm(this.getName().iterator().next() String account = (String) super.getAvailablePrincipal(principals);List roles = new ArrayList(); List permissions = new ArrayList();/從數(shù)據(jù)庫中獲取當(dāng)前登錄用戶的詳細(xì)信息 User user = userService.getByAccount(account);if(user!= null)/實體類User中包含有用戶角色的實體類信息 if(user.getRoles() != null & user.getRoles().size() 0) /獲取當(dāng)前登錄用戶的角色for(Role role : user.getRoles() roles.add(role.getName();/實體類Role中包含有角色權(quán)限的實體類信息 if(role.getPmss() != null & role.getPmss().size() 0) /獲取權(quán)限 for(Permissi

溫馨提示

  • 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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論