目前jfinal使用shiro進行身份驗證和受權的後臺實現已完成,如今我再來總結下學習過程及代碼實現過程。最近半年多項目開發都用.net,但又不甘心用了一年多的java,jfinal就這樣被廢棄,因此就準備業餘時間本身用jfinal搭個框架,作點什麼,具體作什麼,還沒想好,先搭好框架再說。用jfinal實現增刪改查很簡單,從官網下個demo來改改就行了,可是要作個包括有身份驗證及受權完善的系統,就要稍微花點功夫了。java
1、作一些簡單的jfinal的配置(如數據庫配置,路由配置)後,要學習一下java比較流行且成熟的身份驗證受權框架shiro,shiro這個東西乍眼一看以爲挺簡單的,可深刻去研究一下,發現他使用挺簡單,但它的實現原理並無那麼簡單,我的以爲學習shiro的過程,不僅是學習它的使用,更多的是學習它的思想,它用的各類模式,我也說不上來,目前大概也就知道個單例模式和工廠模式,總之,就是高大上和不明覺厲。學習shiro還在路上,由此也激發了我想了解設計模式的慾望。下面再來總結下這兩週學習的shiro吧,不梳理下把他放在腦子裏過一久又當垃圾丟了,學了東西總要在腦子了刻下點什麼東西,對不對?web
2、shiro API理解數據庫
一、Shiro能幫咱們完成認證、受權、加密、會話管理、與Web集成、緩存等功能。目前我主要學習了認證,受權和web繼承。apache
二、Shiro的對外API主要有:Subject,SecurityManager,Realm,三者關係以下:設計模式
(1)Subject(api核心):主體,表明當前用戶,全部Subject都會被綁定到SecurityManager。api
(2)SecurityManager(shiro核心):管理全部Subject,而且與Subjec的t全部交互,都是委託SecurityManager來實現的。緩存
(3)realm:用於獲取用戶身份和擁有權限,即如判斷用戶名和密碼是否匹配,判斷用戶是否擁有某些權限。安全
3、shiro身份認證和受權流程步驟大致以下:app
一、先收集用戶身份和憑證,如用戶名和密碼,並將其轉換爲token,傳遞給Subject進行認證和受權,而Subject又委託給SecurityManager。框架
二、在realm進行身份認證和受權,認證是判斷輸入用戶名和密碼是否正確的過程,認證成功後才能受權,在這裏會經過用戶id獲取該用戶擁有的全部角色和全部權限,以供後面判斷該用戶是否有權限訪問特定資源。
以上步驟作好用戶認證和受權的準備工做,接下來就是怎麼給資源(如方法)加訪問控制權限,好比用戶列表只有擁有「用戶管理」權限的人才能看見,那麼怎麼加這個限制呢?
三、shiro提供jsp標籤和java註解,用來判斷用戶是否擁有某些資源的權限,這裏我用java註解。shiro提供了五種註解,只需將這些註解定義在想要安全控制的方法上便可。
(1)RequiresGuest:加此註解的方法可被匿名用戶訪問
(2)RequiresUser:加此註解的方法只能被已登陸的用戶訪問(包括:已認證或已記住)
(3)RequiresAuthentication:加此註解的方法只能被已認證的用戶訪問(不包括已記住)
(4)RequiresRoles:加此註解的方法僅被指定角色的用戶訪問
(5)RequiresPermissions:加此註解的方法僅被指定權限的用戶訪問
四、接下來j要作的事情就是,怎麼在訪問一個方法時獲取這個方法的註解裏的角色/權限,並與第2步得到的用戶擁有的角色/權限作比較,若是用戶擁有的角色/權限包含了此方法上註解裏的角色/權限,那麼,用戶就能夠調用該方法,若是不包含,則用戶將不能調用該方法,並返回到一個提示未受權的頁面。如今問題來了,像jfinal這樣的web框架怎麼使用shiro攔截全部請求,判斷是否已認證或有權限呢?
(1)在web.xml中配置以下節點
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <listener> <listener-class>org.apache.shiro.web.env.EnvironmentLoaderListener</listener-class> </listener> <filter> <filter-name>ShiroFilter</filter-name> <filter-class>org.apache.shiro.web.servlet.ShiroFilter</filter-class> </filter> <filter-mapping> <filter-name>ShiroFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> </web-app>
經過上面的配置,EnvironmentLoaderListener在容器啓動時初始化SecurityManager,經過ShiroFilter攔截請求並完成認證與受權。
(2)具體獲取每一個方法上的註解,並判斷用戶是否有權限調用該方法,大飛已經實現了,用他的就能夠。