Spring Boot自定義權(quán)限并對對列表進行數(shù)據(jù)多字段權(quán)限過濾史隆,客服端配置

實現(xiàn) Spring Boot 自定義權(quán)限魂务,可以使用 Spring Security 提供的權(quán)限控制功能。在多字段權(quán)限過濾方面泌射,可以通過 Spring Data JPA 提供的 Specification 來實現(xiàn)粘姜。下面是一個實現(xiàn)自定義權(quán)限控制和數(shù)據(jù)多字段權(quán)限過濾的示例代碼:

首先,我們定義一個 UserAuthService 接口熔酷,用于獲取當(dāng)前用戶的權(quán)限信息:java

public interface UserAuthService {
    List<Long> getPermissionIds(String type, String value);
}

接著孤紧,我們定義一個 DataPermissionAspect 切面,用于在需要進行權(quán)限控制的方法中添加權(quán)限條件:java

@Aspect
@Component
public class DataPermissionAspect {

    @Autowired
    private UserAuthService userAuthService;

    @Pointcut("@annotation(DataPermission)")
    public void dataPermission() {}

    @Before("dataPermission()")
    public void before(JoinPoint joinPoint) throws Throwable {
        Object[] args = joinPoint.getArgs();
        if (args.length > 0) {
            DataPermission dataPermission = ((MethodSignature) joinPoint.getSignature())
                    .getMethod().getAnnotation(DataPermission.class);
            if (dataPermission != null) {
                String type = dataPermission.type();
                String value = dataPermission.value();
                List<Long> ids = userAuthService.getPermissionIds(type, value);
                if (!ids.isEmpty()) {
                    Specification specification = (Specification) args[0];
                    CriteriaBuilder builder = specification.getCriteriaBuilder();
                    CriteriaQuery query = builder.createQuery();
                    Root root = query.from(specification.getEntityClass());
                    List<Predicate> predicates = new ArrayList<>();
                    for (String field : dataPermission.fields()) {
                        Path fieldPath = root.get(field);
                        Predicate fieldPredicate = fieldPath.in(ids);
                        predicates.add(fieldPredicate);
                    }
                    Predicate[] predicateArray = predicates.toArray(new Predicate[predicates.size()]);
                    Predicate permissionPredicate = builder.or(predicateArray);
                    query.where(permissionPredicate);
                    args[0] = specification.and(query);
                }
            }
        }
    }
}

在上面的代碼中拒秘,我們定義了一個 DataPermissionAspect 切面号显,攔截帶有 @DataPermission 注解的方法臭猜。在方法執(zhí)行前,我們首先獲取注解中定義的數(shù)據(jù)權(quán)限類型和數(shù)據(jù)權(quán)限值押蚤,然后調(diào)用 UserAuthService 中的方法獲取當(dāng)前用戶有權(quán)限訪問的數(shù)據(jù) ID 列表蔑歌。接著,我們遍歷注解中定義的多個字段揽碘,將數(shù)據(jù)權(quán)限條件添加到每個字段的查詢中次屠。最后,我們將所有字段的查詢條件用 OR 連接起來雳刺,添加到方法的查詢參數(shù)中帅矗,實現(xiàn)數(shù)據(jù)多字段權(quán)限過濾。

在客戶端配置中煞烫,我們需要在 HTTP 請求頭中添加當(dāng)前用戶的權(quán)限信息浑此。下面是一個示例代碼:javascript

import axios from 'axios';

// 添加請求攔截器
axios.interceptors.request.use(function (config) {
  // 從本地存儲中獲取當(dāng)前用戶的權(quán)限信息
  const permissions = JSON.parse(localStorage.getItem('permissions'));
  // 將權(quán)限信息添加到請求頭中
  if (permissions) {
    config.headers['X-User-Permissions'] = JSON.stringify(permissions);
  }
  return config;
}, function (error) {
  return Promise.reject(error);
});

在上面的代碼中,我們使用 Axios 庫發(fā)送 HTTP 請求滞详,并通過請求攔截器在請求頭中添加當(dāng)前用戶的權(quán)限信息

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凛俱,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子料饥,更是在濱河造成了極大的恐慌蒲犬,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,723評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件岸啡,死亡現(xiàn)場離奇詭異原叮,居然都是意外死亡,警方通過查閱死者的電腦和手機巡蘸,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,485評論 2 382
  • 文/潘曉璐 我一進店門奋隶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人悦荒,你說我怎么就攤上這事唯欣。” “怎么了搬味?”我有些...
    開封第一講書人閱讀 152,998評論 0 344
  • 文/不壞的土叔 我叫張陵境氢,是天一觀的道長。 經(jīng)常有香客問我碰纬,道長萍聊,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,323評論 1 279
  • 正文 為了忘掉前任悦析,我火速辦了婚禮寿桨,結(jié)果婚禮上她按,老公的妹妹穿的比我還像新娘牛隅。我一直安慰自己炕柔,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,355評論 5 374
  • 文/花漫 我一把揭開白布媒佣。 她就那樣靜靜地躺著匕累,像睡著了一般。 火紅的嫁衣襯著肌膚如雪默伍。 梳的紋絲不亂的頭發(fā)上欢嘿,一...
    開封第一講書人閱讀 49,079評論 1 285
  • 那天,我揣著相機與錄音也糊,去河邊找鬼炼蹦。 笑死,一個胖子當(dāng)著我的面吹牛狸剃,可吹牛的內(nèi)容都是我干的掐隐。 我是一名探鬼主播,決...
    沈念sama閱讀 38,389評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼钞馁,長吁一口氣:“原來是場噩夢啊……” “哼虑省!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起僧凰,我...
    開封第一講書人閱讀 37,019評論 0 259
  • 序言:老撾萬榮一對情侶失蹤探颈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后训措,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體伪节,經(jīng)...
    沈念sama閱讀 43,519評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,971評論 2 325
  • 正文 我和宋清朗相戀三年绩鸣,在試婚紗的時候發(fā)現(xiàn)自己被綠了怀大。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,100評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡全闷,死狀恐怖叉寂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情总珠,我是刑警寧澤,帶...
    沈念sama閱讀 33,738評論 4 324
  • 正文 年R本政府宣布勘纯,位于F島的核電站局服,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏驳遵。R本人自食惡果不足惜淫奔,卻給世界環(huán)境...
    茶點故事閱讀 39,293評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望堤结。 院中可真熱鬧唆迁,春花似錦鸭丛、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,289評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鼠哥,卻和暖如春熟菲,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背朴恳。 一陣腳步聲響...
    開封第一講書人閱讀 31,517評論 1 262
  • 我被黑心中介騙來泰國打工抄罕, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人于颖。 一個月前我還...
    沈念sama閱讀 45,547評論 2 354
  • 正文 我出身青樓呆贿,卻偏偏與公主長得像,于是被迫代替她去往敵國和親森渐。 傳聞我的和親對象是個殘疾皇子榨崩,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,834評論 2 345

推薦閱讀更多精彩內(nèi)容