shiro 的簡單應用 html
shiro官網:https://shiro.apache.org/apache
shiro 簡介:安全
Apache Shiro(日語"堡壘(Castle)"的意思)是一個強大易用的Java安全框架,提供了認證、受權、加密和會話管理功能,可爲任何應用提供安全保障 - 從命令行應用、移動應用到大型網絡及企業應用。網絡
Shiro爲解決下列問題(我喜歡稱它們爲應用安全的四要素)提供了保護應用的API:多線程
認證 - 用戶身份識別,常被稱爲用戶"登陸";框架
受權 - 訪問控制;jsp
密碼加密 - 保護或隱藏數據防止被偷窺;單元測試
會話管理 - 每用戶相關的時間敏感的狀態。測試
Shiro還支持一些輔助特性,如Web應用安全、單元測試和多線程,它們的存在強化了上面提到的四個要素。ui
項目應用:
controller層
1 @RequiresPermissions("periodical:periodical:view")
2 @RequiresPermissions("periodical:periodical:edit")
jsp頁面:
<li class="active"><a href="${ctx}/periodical_resource/periodicalResource/form?id=${periodicalResource.id}">期刊內容 <shiro:hasPermission name="periodical_resource:periodicalResource:edit">${not empty periodicalResource.id?'修改':'添加'}</shiro:hasPermission> <shiro:lacksPermission name="periodical_resource:periodicalResource:edit">修改</shiro:lacksPermission>
</a>
</li>
shiro jsp 標籤 1、受權的三要素 受權有着三個核心元素:權限、角色和用戶。 權限 權限是Apache Shiro安全機制最核心的元素。它在應用程序中明確聲明瞭被容許的行爲和表現。一個格式良好好的權限聲明能夠清晰表達出用戶對該資源擁有的權限。 大多數的資源會支持典型的CRUD操做(create,read,update,delete),可是任何操做創建在特定的資源上纔是有意義的。所以,權限聲明的根本思想就是創建在資源以及操做上。 而咱們經過權限聲明僅僅能瞭解這個權限能夠在應用程序中作些什麼,而不能肯定誰擁有此權限。 因而,咱們就須要在應用程序中對用戶和權限創建關聯。 一般的作法就是將權限分配給某個角色,而後將這個角色關聯一個或多個用戶。 權限聲明及粒度 Shiro權限聲明一般是使用以冒號分隔的表達式。就像前文所講,一個權限表達式能夠清晰的指定資源類型,容許的操做,可訪問的數據。同時,Shiro權限表達式支持簡單的通配符,能夠更加靈活的進行權限設置。 下面以實例來講明權限表達式。 可查詢用戶數據 User:view 可查詢或編輯用戶數據 User:view,edit 可對用戶數據進行全部操做 User:* 或 user 可編輯id爲123的用戶數據 User:edit:123 角色 Shiro支持兩種角色模式: 1、傳統角色:一個角色表明着一系列的操做,當須要對某一操做進行受權驗證時,只需判斷是不是該角色便可。這種角色權限相對簡單、模糊,不利於擴展。 2、權限角色:一個角色擁有一個權限的集合。受權驗證時,須要判斷當前角色是否擁有該權限。這種角色權限能夠對該角色進行詳細的權限描述,適合更復雜的權限設計。 下面將 詳細描述對兩種角色模式的受權實現。 2、受權實現 Shiro支持三種方式實現受權過程: 編碼實現 註解實現 JSP Taglig實現 jsp頁面: shiro:hasRole name="ROLE_ADMIN"> <li class="user"><a href="${ctx}/admin/user">用戶</a></li> </shiro:hasRole> <shiro:hasAnyRoles name="ROLE_ADMIN,ROLE_SERVICE"> <li class="complaint"><a href="${ctx}/admin/complaint/list">服務</a></li> </shiro:hasAnyRoles> <shiro:hasRole name="ROLE_ADMIN"> <li class="system"><a href="${dmin/repairType/indexctx}/a">系統設置</a></li> </shiro:hasRole> 1、介紹Shiro的標籤guest標籤 :驗證當前用戶是否爲「訪客」,即未認證(包含未記住)的用戶。 <shiro:guest> Hi there! Please <a href="login.jsp">Login</a> or <a href="signup.jsp">Signup</a> today! </shiro:guest> 2、user標籤 :認證經過或已記住的用戶。 <shiro:user> Welcome back John! Not John? Click <a href="login.jsp">here<a> to login. </shiro:user> 3、authenticated標籤 :已認證經過的用戶。不包含已記住的用戶,這是與user標籤的區別所在。 <shiro:authenticated> <a href="updateAccount.jsp">Update your contact information</a>. </shiro:authenticated> 4、notAuthenticated標籤 :未認證經過用戶,與authenticated標籤相對應。與guest標籤的區別 是,該標籤包含已記住用戶。 <shiro:notAuthenticated> Please <a href="login.jsp">login</a> in order to update your credit card information. </shiro:notAuthenticated> 5、principal 標籤 :輸出當前用戶信息,一般爲登陸賬號信息。 Hello, <shiro:principal/>, how are you today? 6、hasRole標籤 :驗證當前用戶是否屬於該角色。 <shiro:hasRole name="administrator"> <a href="admin.jsp">Administer the system</a> </shiro:hasRole> 7、lacksRole標籤 :與hasRole標籤邏輯相反,當用戶不屬於該角色時驗證經過。 <shiro:lacksRole name="administrator"> Sorry, you are not allowed to administer the system. </shiro:lacksRole> 8、hasAnyRole標籤 :驗證當前用戶是否屬於如下任意一個角色。 <shiro:hasAnyRoles name="developer, project manager, administrator"> You are either a developer, project manager, or administrator. </shiro:lacksRole> 9、hasPermission標籤 :驗證當前用戶是否擁有指定權限。 <shiro:hasPermission name="user:create"> <a href="createUser.jsp">Create a new User</a> </shiro:hasPermission> 10、lacksPermission標籤 :與hasPermission標籤邏輯相反,當前用戶沒有制定權限時,驗證通 過。 <shiro:hasPermission name="user:create"> <a href="createUser.jsp">Create a new User</a> </shiro:hasPermission> controller層的shiro 註解使用 @RequiresPermissions("account:create") public void createAccount(Account account) { //this method will only be invoked by a Subject //that is permitted to create an account ... }