提示:文章寫完后,目錄可以自動生成,如何生成可參考右邊的幫助檔案
文章目錄
- 前言
- 一、xmall中如何使用shiro
- 二、shiro校驗
- 1.shiro配置
- 2.登錄權限校驗
- 總結
前言
這里我說一說我最近的學習感受,在接觸開源專案的時候,我已經儲備了一些基礎知識,知道了一些框架怎么使用,這個時候看代碼,你會有很多疑問,比如執行順序,為什么這么配置,這個時候你會不斷的ctrl+b 一層一層進去看,越看你就越開始懷疑自己,我真的會了嗎?我這里可能不是要叫你一定要弄到它的原理什么的,想你傳遞學習的負面資訊,我覺得對于一個新手而言,學習框架的時候應該有清楚的認識,框架肯定是被封裝過的,其次你學框架干嘛?是會用了,了解了就可以,那么一開始就沒必要深入研究,
一、xmall中如何使用shiro
上面一篇我看了xmall-sso 單點登錄功能,我們發現這里面的代碼很簡單,就是去資料庫查詢然后校驗,生成token放到redis中,還寫了一個根據token獲取用戶資料的方法,那么在服務呼叫的時候是不是每次都需要自己手動校驗登錄狀態和權限呢?不管每個請求都自己手動寫校驗還是用AOP實作校驗,都需要我們自己實作,一個是增加了專案的復雜度和難度,也容易出錯,

我們可以看到xmall-front-web 中沒有使用,但是在xmall-manager-web中用到了shiro,接下來我們來看看如何使用shiro框架來實作登錄和權限校驗的,
二、shiro校驗
1.shiro配置
<!-- 配置自定義Realm -->
<bean id="myRealm" class="cn.exrick.manager.shiro.MyRealm"/>
<!-- 安全管理器 -->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myRealm"/>
</bean>
<bean id="perms" class="cn.exrick.manager.shiro.MyPermissionFilter"/>
<!-- Shiro過濾器 核心-->
<bean id="shiroFilter" class="cn.exrick.manager.shiro.MyShiroFilterFactoryBean">
<!-- Shiro的核心安全介面,這個屬性是必須的 -->
<property name="securityManager" ref="securityManager"/>
<!-- 身份認證失敗,則跳轉到登錄頁面的配置 -->
<property name="loginUrl" value="/login"/>
<!-- 登錄成功之后的 跳轉頁面 -->
<property name="successUrl" value="/"/>
<!-- 權限認證失敗,則跳轉到指定頁面 -->
<property name="unauthorizedUrl" value="/403"/>
<!--自定義過濾器-->
<property name="filters">
<util:map>
<entry key="perms" value-ref="perms"></entry>
<entry key="roles" value-ref="perms"></entry>
</util:map>
</property>
<!-- Shiro連接約束配置,即過濾鏈的定義 -->
<property name="filterChainDefinitions">
<value>
<!--anon 表示不需要認證以及授權-->
<!--authc 表示需要認證 沒有登錄是不能進行訪問的-->
<!--perms 表示需要該權限才能訪問的頁面 /user/* = perms[/*] -->
<!--roles 表示需要角色才能訪問的頁面 /* = roles[管理員]-->
<!--/login = anon
/401 = anon
/ = authc
/index = authc
/welcome = authc
/thanks-pic = authc
/lock-screen = authc
/user/logout = authc
/user/userInfo = authc-->
</value>
</property>
</bean>
<!-- Shiro生命周期處理器 -->
<bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
這里可以分幾個部分
配置securityManager安全管理器 他需要注入一個Realm
配置自定義的realm
配置自定義的filter MyPermissionFilter
2.登錄權限校驗
看下它具體的執行流程
一個url請求過來,首先被MyPermissionFilter攔截

這個類里就一個方法isAccessAllowed 這是一個什么方法呢?
ctrl+b 在AccessControlFilter中找到它是一個抽象方法并且找到了在什么地方呼叫的,這里我們順帶看一下onAccessDenied 這個方法它和isAccessAllowed 區別就是一個在登錄時候,用一個在登錄失敗的時候走這個方法,一般用來重定向到401頁面

在往里看在這個PathMatchingFilter里面終于找到熟悉的代碼了
preHandle方法是進行處理器攔截用的,顧名思義,該方法將在Controller處理之前進行呼叫,
看到這兒是不是發現filter(過濾器) 和Interceptor(攔截器)很像 推薦一篇文章Filter與Interceptor 區別
完事后回到controller
SecurityUtils就是
subject 也是securityManager管理的
最后subject.login(token),去呼叫框架登錄權限校驗等
總結
shiro里面的知識還有很多很多,如果當當看一兩個案例是不全面的,最好還是去看官方的檔案,后面我們改造專案加入JWT
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/34763.html
標籤:其他
