【Struts2】:Interceptor實戰之許可權控制
之前的部落格介紹了攔截器的概念以及Struts2自帶以及自定義攔截器的一些基礎知識,但是攔截器究竟如何應用在實際專案裡,或許你還很迷惑,那麼本次部落格我們就一起來實戰一下,也算是對攔截器的一個總結和應用實踐。
我們在做任何的資訊管理系統的時候,無可避免的要進行許可權控制,對於登入使用者的身份以及所擁有的許可權進行驗證,不讓不合法的使用者隨意更改我們的資料和程式,以保證系統的安全性。這樣一個非常普遍的功能,我們要使用Struts2的攔截器去實現許可權檢查,當瀏覽者需要請求執行某個操作時,應用系統需要先檢查使用者是否登入,以及是否有足夠的許可權來執行該操作。
在這個Demo中,我們要求使用者必須登入,並且必須為指定使用者名稱的使用者才可以檢視系統中的某個檢視資源,否則,系統直接轉入登入頁面。對於這樣的需求,可以在每個Action執行實際的處理邏輯之前,先進行許可權驗證邏輯,但是這種做法不利於程式碼的複用,因為大部分Action裡的許可權驗證程式碼都大同小異,故將這些許可權驗證的程式碼放在攔截器中將顯得更加方便和靈活,也更為專業。
檢查使用者是否登入,通常都是通過跟蹤使用者的Session來完成的,通過ActionContext即可訪問到session中的屬性,攔截器的intercept方法的invocation引數可以很容易地訪問到請求相關的ActionContext例項。
實現了上述的許可權驗證攔截器,就可以在配置檔案中隨意使用該攔截器對需要實現許可權控制的Action進行配置,使之具有許可權控制的功能。具體在struts.xml檔案中如何定義和應用於Action中,請看如下具體配置:
考慮到該攔截器的複用性問題,系統可能每個頁面都需要進行許可權控制,因此可以將login的結果對映定義為全域性結果對映,具體配置方法看上面程式碼。如果要簡化struts.xml檔案的配置量,避免在每個Action中重複配置該攔截器,可以將該攔截器與Struts2預設的攔截器棧放在一起,定義成新的預設攔截器棧mydefaultstack,這樣就不用在每個Action中重複定義許可權驗證攔截器了,預設已有,這體現了抽象—>封裝的思想,跟我們編寫程式碼時遇到重複程式碼就抽出來進行封裝複用是一個道理。
我們在做任何的資訊管理系統的時候,無可避免的要進行許可權控制,對於登入使用者的身份以及所擁有的許可權進行驗證,不讓不合法的使用者隨意更改我們的資料和程式,以保證系統的安全性。這樣一個非常普遍的功能,我們要使用Struts2的攔截器去實現許可權檢查,當瀏覽者需要請求執行某個操作時,應用系統需要先檢查使用者是否登入,以及是否有足夠的許可權來執行該操作。
在這個Demo中,我們要求使用者必須登入,並且必須為指定使用者名稱的使用者才可以檢視系統中的某個檢視資源,否則,系統直接轉入登入頁面。對於這樣的需求,可以在每個Action執行實際的處理邏輯之前,先進行許可權驗證邏輯,但是這種做法不利於程式碼的複用,因為大部分Action裡的許可權驗證程式碼都大同小異,故將這些許可權驗證的程式碼放在攔截器中將顯得更加方便和靈活,也更為專業。
檢查使用者是否登入,通常都是通過跟蹤使用者的Session來完成的,通過ActionContext即可訪問到session中的屬性,攔截器的intercept方法的invocation引數可以很容易地訪問到請求相關的ActionContext例項。
我們先來編寫許可權驗證攔截器類的程式碼,具體程式碼如下
// 許可權檢查攔截器繼承AbstractInterceptor類
public class AuthorityInterceptor
extends AbstractInterceptor
{
// 攔截Action處理的攔截方法
public String intercept(ActionInvocation invocation)
throws Exception
{
// 取得請求相關的ActionContext例項
ActionContext ctx = invocation.getInvocationContext();
Map session = ctx.getSession();
// 取出Session裡的user屬性
String user = (String)session.get("user");
//如果沒有登入,或者登入所用的使用者名稱不是admin,都返回重新登入
if (user != null && user.equals("admin") )
{
return invocation.invoke();
}
// 如果沒有登入,將伺服器提示放入ActionContext中
ctx.put("tip" ,"您還沒有登入,請輸入管理員賬號登入系統");
// 返回login的邏輯檢視
return Action.LOGIN;
}
}
從上面的程式碼中可以看到,先通過ActionInvocation引數獲取使用者的Session例項的引用,然後從中取出user屬性,通過判斷該屬性值來確定使用者是否登入系統,從而判斷是否需要轉入登入頁面。實現了上述的許可權驗證攔截器,就可以在配置檔案中隨意使用該攔截器對需要實現許可權控制的Action進行配置,使之具有許可權控制的功能。具體在struts.xml檔案中如何定義和應用於Action中,請看如下具體配置:
<package name="lee" extends="struts-default">
<!-- 使用者攔截器定義在該元素下 -->
<interceptors>
<!-- 定義了一個名為authority的攔截器 -->
<interceptor name="authority"
class="org.ljw.app.interceptor.AuthorityInterceptor"/>
</interceptors>
<!-- 定義全域性Result -->
<global-results>
<!-- 當返回login檢視名時,轉入loginForm.jsp頁面 -->
<result name="login">/WEB-INF/content/loginForm.jsp</result>
</global-results>
<action name="login" class="org.ljw.app.action.LoginAction">
<result name="error">/WEB-INF/content//error.jsp</result>
<result>/WEB-INF/content/welcome.jsp</result>
</action>
<!-- 定義一個名為viewBook的Action,其實現類為ActionSupport -->
<action name="viewBook">
<!-- 返回success檢視名時,轉入viewBook.jsp頁面 -->
<result>/WEB-INF/content/viewBook.jsp</result>
<interceptor-ref name="defaultStack"/>
<!-- 應用自定義攔截器 -->
<interceptor-ref name="authority"/>
</action>
<action name="*">
<result>/WEB-INF/content/{1}.jsp</result>
</action>
</package>
上面名為viewBook的Action,沒有指定class屬性,預設使用ActionSupport類,配置該Action時,只指定了一個結果對映,指定系統返回success字串時,系統將轉入viewBook頁面,但並未配置login檢視名對應的jsp頁面。考慮到該攔截器的複用性問題,系統可能每個頁面都需要進行許可權控制,因此可以將login的結果對映定義為全域性結果對映,具體配置方法看上面程式碼。如果要簡化struts.xml檔案的配置量,避免在每個Action中重複配置該攔截器,可以將該攔截器與Struts2預設的攔截器棧放在一起,定義成新的預設攔截器棧mydefaultstack,這樣就不用在每個Action中重複定義許可權驗證攔截器了,預設已有,這體現了抽象—>封裝的思想,跟我們編寫程式碼時遇到重複程式碼就抽出來進行封裝複用是一個道理。
相關文章
- 如何用 Vue 實現前端許可權控制(路由許可權 + 檢視許可權 + 請求許可權)Vue前端路由
- Laravel實現許可權控制Laravel
- 資料安全之許可權控制
- MySQL許可權管理實戰MySql
- 降魔篇之springmvc許可權控制SpringMVC
- Elasticsearch 許可權控制Elasticsearch
- 許可權之選單許可權
- Atlas 2.1.0 實踐(4)—— 許可權控制
- Spring Boot 之 RESRful API 許可權控制Spring BootAPI
- Linux許可權控制Linux
- Appfuse:許可權控制APP
- 深入Django:使用者認證與許可權控制實戰指南Django
- spring aop實現許可權控制,路徑控制Spring
- SpringSecurity許可權管理系統實戰—九、資料許可權的配置SpringGse
- mysql 許可權控制筆記MySql筆記
- oracle列級許可權控制Oracle
- Linux的許可權控制Linux
- .NET 程式許可權控制、獲得管理員許可權程式碼
- Nestjs RBAC 許可權控制管理實踐(一)JS
- Nestjs RBAC 許可權控制管理實踐 (二)JS
- 前端許可權控制系統的實現思路前端
- Linux 許可權管理之目錄許可權限制Linux
- kubernetes實戰篇之Dashboard的訪問許可權限制訪問許可權
- ASP.NET Core 實戰:基於 Jwt Token 的許可權控制全揭露ASP.NETJWT
- MAUI之安卓許可權UI安卓
- 資料分析的許可權控制
- 許可權控制及AOP日誌
- Java 訪問許可權控制(6)Java訪問許可權
- vue-router控制路由許可權Vue路由
- 下載許可權控制機制
- Solaris下控制ftp的許可權FTP
- SpringMVC使用攔截器實現許可權控制SpringMVC
- 領域驅動設計之實戰許可權系統微服務微服務
- DRF內建許可權元件之自定義許可權管理類元件
- Linux特殊許可權之suid、sgid、sbit許可權LinuxUI
- Android許可權管理之Permission許可權機制及使用Android
- Oracle的物件許可權、角色許可權、系統許可權Oracle物件
- 小知識:軟體開發的許可權控制和許可權驗證