Shrio學習心得

最近又跟這個老師學了shrio,他先解釋了認證和授權,然後以原始的過濾器(或者springmvc攔截器)的方式進行認證和授權。然後說明了使用角色進行授權的問題
推薦使用權限授權。

    認證和授權---認證   即登陸 是否是系統的用戶
                                   |
                                   ----授權  即驗證登陸後是否有某個url的訪問權限

然後講了shrio,整體下來並沒有覺得shrio的優勢在哪,就是權限和資源的映射配置分散開了,不用在數據庫中把所有的資源都跟權限做映射了。其實很多項目中權限跟資源屬於一回事。
使用shrio分開就跟方便了。

        用戶表  (用戶角色表 多對多)   角色表    (角色權限表 多對多)  權限表       (權限資源表 多對多)         資源表

下面一張圖是我理解的在與web和spirng整合後的結構圖:

 

    1、shiro在spring的配置就不細說了,配置了過濾器,配置了代理和註解,在jsp頁面使用標籤
    2、shrio認證和權限檢查過程大家都熟知,securityManager最終調用realm檢查權限,很多都是shrio寫死的通用檢查功能,想要實現自己的方式就要繼承和實現。
    3、與web和spring整合後,從哪裏調用shrio的認證權限檢查以及認證/檢查成功和失敗後又會怎麼處理是重點

    在web中shrio與spring集成後有三個調用入口
        1:過濾器鏈,這個過濾器鏈被spring在web中註冊的過濾器代理調用。過濾器鏈會調用securityManager進行認證和權限檢查。
        過濾器鏈中包含了各種過濾器,有靜態資源過濾器,認證過濾器,權限過濾器。匿名過濾器直接返回靜態資源並return false不進行後續過濾。認證和權限過濾去都會繼續過濾 和進入springmvc的disparcherservlet。一般我們不使用權限過濾器,因爲配置太多。我們只適用匿名過濾器和認證過濾器。如果認證過濾器發現沒有認證,則跳轉到配置的登陸url中,如果認證失敗,則跳轉到處理失敗的url中,如果認證成功則重定向到上次訪問的url。

        2:經過過濾器後請求進入了springmvc的controller中。根據shrio的註解,這裏我們的controller實際上是經過shrio處理過的代理。在執行controller之前進行了增強就是查詢了securitymanager進行了權限驗證,如果驗證成功,繼續執行我們寫的controller代碼。如果驗證失敗則出現異常,進入springmvc的異常處理器。

        3:在jsp頁面,使用shrio標籤,則在web容器解析標籤時執行標籤對應的代碼,查詢securitymanager,如果驗證成功則顯示,不成功不顯示。

    可能出現的問題:
    1:由於某些項目沒有配置spring,直接使用了springmvc,那麼就不能使用過濾器鏈,不能認證了。但是註解的權限認證應該還是能用。所以正常的方式還是spring容器也要使用。
    2:由於springmvc的各種插件使得,controller被多次被代理,即生成了代理的代理,這樣難免會出現一些錯誤。
    3:匿名過濾器不會繼續放行,認證過濾器會繼續放行,而且認證過濾其會先執行。
    4:使用了註解的權限檢查,那麼過濾器鏈中配置的權限錯誤頁面是不會執行的,這是兩個不同的地方。

 

 

/*一些廢話:

很久沒有寫博客了,最近看了shrio權限管理,首先看的是《跟我學shrio》,我是那種沒有耐心的人,看了十來章就看不下去了,看的雲裏霧裏。索性找視頻看,然後就找到了網上的資源,這個xxxx的教育機構真不錯,裏面的老師的水平也很高,我的jdbc,DBCP,spring,springmvc,mybatis都是跟這個老師的視頻學的。


    懂得了spring
    1:明白了web容器,spring就是web中設置的一個listener產生的容器,
    2:所有的要用的東西(bean)都在容器中產生,並根據配置的依賴進行植入,實現控制反轉,
    3:又知道了每個bean的產生前後都調用了後處理bean來進行加工,以此我們可以方便的對bean進行動態代理,由此也產生了面向切面的編程AOP
    4:明白了spring使用aspectj的註解,大部分情況只是用了他的註解,沒有用aspectj的實現機制,而是用了java代理和cglib代理來實現。
    5:有了動態代理很多東西可以很方便的實現,


    明白了springmvc
    1:springmvc不依賴spring,springmvc是web中的一個servlet,使用這個servlet會產生一個spring容器的子類,容器中實現spring的功能。
    2:如果又spring容器存在,則繼承spring的容器,可以獲得spring容器的所有bean,但spring容器不能獲取springmvc子容器中的bean。
    3:springmvc由disparcherservlet前端控制器獲取請求到處理器映射器,映射器返回處理器鏈,並通過文件轉換器,屬性編輯器,參數轉換器等將請求中的參數轉
       換位controller中的參數,並傳入處理器適配器,適配器調用controller的方法返回modleandview,通過視圖解析器解析,最後渲染視圖並返回,每個xx器都是
       由前端控制器調用並獲取返回結果的。
    
    spring框架由於可以方便的進行動態代理,實現aop,所以第三方插件可以方便的進行集成。通過對需要使用插件功能的bean全部生成代理來增強的方式來應用第三方
插件。其中spirngmvc攔截器就是AOP,springmvc的異常攔截器也是AOP。spring的事務控制也是aop。aspectj也是AOP。

    學習了mybatis,明白了面向對象的方式處理數據庫,以前查詢數據庫都是獲取了直接量,map,list<map>形式,以後就需要將結果包裝成pojo。以對象的方式操作
數據庫結果。當然mybatis是半面先對象。*/

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章