版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 農(nóng)業(yè)灌溉水電設(shè)施管理與維護(hù)規(guī)定
- 焊接作業(yè)環(huán)境適應(yīng)性分析與改善策略
- 高一化學(xué)教案:專題第二單元第一課時乙醇
- 2024屆南安市中考化學(xué)對點突破模擬試卷含解析
- 2024高中化學(xué)第五章進(jìn)入合成有機(jī)高分子化合物的時代3功能高分子材料課時作業(yè)含解析新人教版選修5
- 2024高中地理課時作業(yè)6流域的綜合開發(fā)-以美國田納西河流域為例含解析新人教版必修3
- 2024高中語文開學(xué)第一課學(xué)生觀后感范文700字少年強(qiáng)中國強(qiáng)素材
- 2024高中語文第二單元置身詩境緣景明情賞析示例春江花月夜學(xué)案新人教版選修中國古代詩歌散文欣賞
- 2024高中語文精讀課文一第1課3侍奉皇帝與走向人民作業(yè)含解析新人教版選修中外傳記蚜
- 2024高考化學(xué)一輪復(fù)習(xí)第十章化學(xué)實驗基礎(chǔ)第一講化學(xué)實驗常用儀器和基本操作規(guī)范演練含解析新人教版
- Linux操作系統(tǒng)實用教程-統(tǒng)信UOS 課件 第1章 國產(chǎn)操作系統(tǒng)基礎(chǔ)
- 2023秋季初三物理 電路故障分析專題(有解析)
- 同濟(jì)大學(xué)信紙
- 沖壓模具設(shè)計-模具設(shè)計課件
- 高處作業(yè)安全培訓(xùn)課件-
- 職中英語期末考試質(zhì)量分析
- 中國的世界遺產(chǎn)智慧樹知到答案章節(jié)測試2023年遼寧科技大學(xué)
- 急性腹瀉與慢性腹瀉修改版
- 先天性肌性斜頸的康復(fù)
- GB/T 37518-2019代理報關(guān)服務(wù)規(guī)范
- PPT溝通的藝術(shù)課件
評論
0/150
提交評論