利用註解和反射實現超輕量級許可權管理

2021-07-24 12:29:10 字數 1911 閱讀 7129

專案中需要用到許可權管理,但是角色非常少,覺得使用spring security會比較重。所以,打算自己寫乙個簡單的角色檢查,實現原理就是:

把使用者的資訊(一定要包含角色id)放到session裡,然後在controller方法上加註解,該註解會標記哪些角色可以訪問,通過aop反射解析註解,同時從session裡拿到請求使用者的角色id進行比較。

由於使用到了aspectj,所以要在spring的配置檔案裡宣告下:

先定義乙個註解,它是角色id被檢查的載體:

/**

* 這個註解用來確定哪些使用者可以做哪些操作,目前我們只有3個角色,管理員,高階使用者,普通使用者。

* 其中普通使用者只能檢視,管理員可以操作一切,高階使用者只比管理員少了管理使用者的功能。

*/@documented//文件

@retention(retentionpolicy.runtime)//在執行時可以獲取

@target(elementtype.method)//作用到類,方法,介面上等

public @inte***ce rolesallowed

再定義aop***,內部通過反射解析註解(順帶可以檢查使用者是否登入過):

/**

* 這個類用來攔截請求,如果使用者沒有登入,則被要求先登入。

* 任何請求訪問的controller的方法都會被檢測,看是否包含

* rolesallowed註解,如果有就看當前登入使用者是否有許可權操作這個方法。

*/@component

@aspect

public class rolecontrolaspect

user user = new user();

try catch (exception e)

int roleid = 0;

if (user != null)

methodsignature methodsignature = (methodsignature) joinpoint.getsignature();

method method = methodsignature.getmethod();

if (method.isannotationpresent(rolesallowed.class))

}throw new runtimeexception("使用者許可權不夠。");

}}

}}

這個類有幾個需要注意的地方:

1. 必須加上@component 註解,不然spring的掃瞄不到;

2. 必須使用 methodsignature,不然無法獲得method 類,也就沒辦法獲得定義其上的 rolesallowed 註解。

最後就是在 controller的方法上加上 rolesallowed 註解,裡面標上哪些角色可以訪問,為了簡單,我直接使用逗號分隔角色id:

稍微補充下,可以定義乙個專門攔截controller 的***,spring 有個 @controlleradvice 註解,使用它就可以攔截所有controller的事件,下面的**只是攔截 controller 裡面丟擲的異常。我們專案組開發是前後端分離的,所以只需要返回乙個json字串即可:

@controlleradvice

public class globalexceptionhandler

}

erlang的超輕量級程序是如何實現的

在windows下做了實驗,用erlang shell起60萬個erlang程序,占用記憶體760多m,平均每個程序占用記憶體1.27k,建立每個程序的時間約4微秒。在配置好得多的linux伺服器上,用pthread起執行緒,平均每個執行緒建立時間48微秒。查了一下資料 http www.erlan...

關於許可權設計的輕量級實現

關於許可權設計的輕量級實現 在各種各樣的系統中,許可權設計是必不可少的,現在基本基於角色的思想,即乙個使用者屬於某個角色當然也可能屬於多個角色,然後根據角色來確實相應的許可權,以進一步驗證其合法性,最後才執行操作.很多人可能在使用者進入系統的某模組之前就進行許可權驗證,後來知道,微軟的sps並不是這...

利用 SQLAlchemy 實現輕量級資料庫遷移

本文介紹結合 python 的幾個工具,實現輕量級的資料庫遷移。在日常工作中,可能需要將資料遷移到不同的資料庫,可以考慮下面一些簡單的辦法 假設我們現在需要把 sql server 中 emp master 表的資料遷移到 sqlite 資料庫的同名表中。遷移的過程分為兩步 首先利用 sqlacod...