前端如何進行用戶許可權管理

来源:https://www.cnblogs.com/jnshu/archive/2018/12/07/10084857.html
-Advertisement-
Play Games

1:問題: 假如在做一個管理系統,面向老師學生的,學生提交申請,老師負責審核(或者還需要添加其他角色,功能許可權都不同)。 現在的問題是,每種角色登錄看到的界面應該都是不一樣的,那這個頁面的區分如何實現呢? 2:要不要給老師和學生各自設計一套頁面?這樣工作量是不是太大了,並且如果還要加入其它角色的話, ...


1:問題:

假如在做一個管理系統,面向老師學生的,學生提交申請,老師負責審核(或者還需要添加其他角色,功能許可權都不同)。

現在的問題是,每種角色登錄看到的界面應該都是不一樣的,那這個頁面的區分如何實現呢?

2:要不要給老師和學生各自設計一套頁面?這樣工作量是不是太大了,並且如果還要加入其它角色的話,難道每個角色對應一套代碼?

所以我們需要用一套頁面適應各種用戶角色,並根據身份賦予他們不同許可權

3:許可權設計與管理是一個很複雜的問題,涉及的東西很多,相比前端,更偏向於後端,在搜集相關資料的過程中

,發現摻雜了許多資料庫之類的知識,以及幾個用於許可權管理的java框架,比如spring,比如shiro等等,都屬於後端的工作

4:那我們前端能做什麼呢?

許可權的設計中比較常見的就是RBAC基於角色的訪問控制,基本思想是,對系統操作的各種許可權不是直接授予具體的用戶,而是在用戶集合與許可權集合之間建立一個角色集合。每一種角色對應一組相應的許可權。

一旦用戶被分配了適當的角色後,該用戶就擁有此角色的所有操作許可權。這樣做的好處是,不必在每次創建用戶時都進行分配許可權的操作,只要分配用戶相應的角色即可,而且角色的許可權變更比用戶的許可權變更要少得多,這樣將簡化用戶的許可權管理,減少系統的開銷。

在Angular構建的單頁面應用中,要實現這樣的架構我們需要額外多做一些事.從整體項目上來講,大約有3處地方,前端工程師需要進行處理.

1. UI處理(根據用戶擁有的許可權,判斷頁面上的一些內容是否顯示)

2. 路由處理(當用戶訪問一個它沒有許可權訪問的url時,跳轉到一個錯誤提示的頁面)

3. HTTP請求處理(當我們發送一個數據請求,如果返回的status是401或者401,則通常重定向到一個錯誤提示的頁面)

如何實現?

首先需要在Angular啟動之前就獲取到當前用戶的所有的permissions,然後比較優雅的方式是通過一個service存放這個映射關係.對於UI處理一個頁面上的內容是否根據許可權進行顯示,我們應該通過一個directive來實現.當處理完這些,我們還需要在添加一個路由時額外為其添加一個"permission"屬性,併為其賦值表明擁有哪些許可權的角色可以跳轉這個URL,然後通過Angular監聽routeChangeStart事件來進行當前用戶是否擁有此URL訪問許可權的校驗.最後還需要一個HTTP攔截器監控當一個請求返回的status是401或者403時,跳轉頁面到一個錯誤提示頁面.

大致上的工作就是這些,看起來有些多,其實一個個來還是挺好處理的.

在Angular運行之前獲取到permission的映射關係

 

 

Angular項目通過ng-app啟動,但是一些情況下我們是希望Angular項目的啟動在我們的控制之中.比如現在這種情況下,我就希望能獲取到當前登錄用戶的所有permission映射關係後,再啟動Angular的App.幸運的是Angular本身提供了這種方式,也就是angular.bootstrap().看的仔細的人可能會註意到,這裡使用的是$.get(),沒有錯用的是jQuery而不是Angular的$resource或者$http,因為在這個時候Angular還沒有啟動,它的function我們還無法使用.

進一步使用上面的代碼可以將獲取到的映射關係放入一個service作為全局變數來使用.

 

 

在取得當前用戶的許可權集合後,我們將這個集合存檔到對應的一個service中,然後又做了2件事:

(1) 將permissions存放到factory變數中,使之一直處於記憶體中,實現全局變數的作用,但卻沒有污染命名空間.

(2) 通過$broadcast廣播事件,當許可權發生變更的時候.

如何確定UI組件的依據許可權進行顯隱


 

這裡我們需要自己編寫一個directive,它會依據許可權關係來進行顯示或者隱藏元素.

這裡看到了比較理想的情況是通關一個has-permission屬性校驗permission的name,如果當前用戶有則顯示,沒有則隱藏.

 

 

擴展一下之前的factory:

 

 

路由上的依許可權訪問
這一部分的實現的思路是這樣: 當我們定義一個路由的時候增加一個permission的屬性,屬性的值就是有哪些許可權才能訪問當前url.然後通過routeChangeStart事件一直監聽url變化.每次變化url的時候,去校驗當前要跳轉的url是否符合條件,然後決定是跳轉成功還是跳轉到錯誤的提示頁面.

router.js:

 

 

mainController.js 或者 indexController.js (總之是父層Controller)

 

 

這裡依然用到了之前寫的hasPermission,這些東西都是高度可復用的.這樣就搞定了,在每次view的route跳轉前,在父容器的Controller中判斷一些它到底有沒有跳轉的許可權即可.

HTTP請求處理

這個應該相對來說好處理一點,思想的思路也很簡單.因為Angular應用推薦的是RESTful風格的介面,所以對於HTTP協議的使用很清晰.對於請求返回的status code如果是401或者403則表示沒有許可權,就跳轉到對應的錯誤提示頁面即可.

當然我們不可能每個請求都去手動校驗轉發一次,所以肯定需要一個總的filter.代碼如下:

 

 

寫到這裡我們就基本實現了在這種前後端分離模式下,前端部分的許可權管理和控制。

 

 

“我們相信人人都可以成為一個工程師,現在開始,找個師兄,帶你入門,學習的路上不再迷茫。

這裡是技能樹.IT修真院:http://www.jnshu.com,初學者轉行到互聯網行業的聚集地。"

歡迎加IT交流群565734203與大家一起討論交流


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • ionic app打包和簽名 1、首先在項目根目錄執行 ionic platform add android 生成Android平臺。 2、配置應用簽名:在根目錄下執行以下命令 命令說明: 結果如下:會在根目錄生成一個myApp.keystore的文件 3、使用build命令編譯一個應用的發佈版本, ...
  • 眾所周知,國內手機的操作系統被安卓壟斷,雖說目前國內有華為的EMUI系統,小米的MI,還有錘子OS等等,但是這些都是基於安卓源代碼的OS,對此很多人表示什麼時候我們能有自己的操作系統。 在上次的晶元壟斷事件之後,越來越多的人認識到了自主研發的重要性,假如哪一天谷歌公司禁止中國科技企業使用安卓系統,按 ...
  • 今天呢,又繼續看了flutter 弗拉特 的東西,絕的這個東西絕對是比ReactNative更高一層次的,在2018年12月5好,flutter的第一個stale1.0發佈了,我們在GitHub上可以看到,之前在github上只有dev,分支和beta分支,許多用flutter開發的app都是用的b ...
  • 0前言 陸續的用Node已經一年多了,已經用node寫了幾個的項目,也該是總結node學習的過程了 1.Node是啥? Node.js是一使用JavaScript作為開發語言,運行在伺服器端的Web伺服器,也就是說是 JavaScript的服務端運行環境,這麼說其實還不嚴謹。node除了實現了js的 ...
  • es6常用語法簡介 es是js的規範標準 let 特點: 1.有全局和函數作用域,以及塊級作用域(用{}表示塊級作用域範圍) 2.不會存在變數提升 3.變數不能重覆聲明 const 特點: 1.有塊級作用域 2.不會存在變數提升 3.不能重覆聲明變數, 4.只聲明常量,必須賦值,且定義之後不能更改 ...
  • 作為前端開發者的伙伴們,肯定對Promise,Generator,async/await非常熟悉不過了。Promise絕對是爛記於心,而async/await卻讓使大伙們感覺到爽(原來非同步可以這麼簡單)。可回頭來梳理他們的關聯時,你驚訝的發現,他們是如此的密切相關。 一、三者關係與發展史 我對他們三 ...
  • 場景: jsx 綁定方法 方法有3種 1: clickEye(a, b){ // do something..... } clickEye(a, b){ // do something..... } 2: 3: 總結: 我個人基本拋棄了第二種方法,經常使用的是第三種方法,如果遇到需要傳特殊參數,並且 ...
  • 這裡是修真院前端小課堂,每篇分享文從 【背景介紹】【知識剖析】【常見問題】【解決方案】【編碼實戰】【擴展思考】【更多討論】【參考文獻】 八個方面深度解析前端知識/技能,本篇分享的是: 【F12 console的用法,以及如何debug程式?】 1.背景介紹 Chrome中Console是用於顯示JS ...
一周排行
    -Advertisement-
    Play Games
  • 前言 本文介紹一款使用 C# 與 WPF 開發的音頻播放器,其界面簡潔大方,操作體驗流暢。該播放器支持多種音頻格式(如 MP4、WMA、OGG、FLAC 等),並具備標記、實時歌詞顯示等功能。 另外,還支持換膚及多語言(中英文)切換。核心音頻處理採用 FFmpeg 組件,獲得了廣泛認可,目前 Git ...
  • OAuth2.0授權驗證-gitee授權碼模式 本文主要介紹如何筆者自己是如何使用gitee提供的OAuth2.0協議完成授權驗證並登錄到自己的系統,完整模式如圖 1、創建應用 打開gitee個人中心->第三方應用->創建應用 創建應用後在我的應用界面,查看已創建應用的Client ID和Clien ...
  • 解決了這個問題:《winForm下,fastReport.net 從.net framework 升級到.net5遇到的錯誤“Operation is not supported on this platform.”》 本文內容轉載自:https://www.fcnsoft.com/Home/Sho ...
  • 國內文章 WPF 從裸 Win 32 的 WM_Pointer 消息獲取觸摸點繪製筆跡 https://www.cnblogs.com/lindexi/p/18390983 本文將告訴大家如何在 WPF 裡面,接收裸 Win 32 的 WM_Pointer 消息,從消息裡面獲取觸摸點信息,使用觸摸點 ...
  • 前言 給大家推薦一個專為新零售快消行業打造了一套高效的進銷存管理系統。 系統不僅具備強大的庫存管理功能,還集成了高性能的輕量級 POS 解決方案,確保頁面載入速度極快,提供良好的用戶體驗。 項目介紹 Dorisoy.POS 是一款基於 .NET 7 和 Angular 4 開發的新零售快消進銷存管理 ...
  • ABP CLI常用的代碼分享 一、確保環境配置正確 安裝.NET CLI: ABP CLI是基於.NET Core或.NET 5/6/7等更高版本構建的,因此首先需要在你的開發環境中安裝.NET CLI。這可以通過訪問Microsoft官網下載並安裝相應版本的.NET SDK來實現。 安裝ABP ...
  • 問題 問題是這樣的:第三方的webapi,需要先調用登陸介面獲取Cookie,訪問其它介面時攜帶Cookie信息。 但使用HttpClient類調用登陸介面,返回的Headers中沒有找到Cookie信息。 分析 首先,使用Postman測試該登陸介面,正常返回Cookie信息,說明是HttpCli ...
  • 國內文章 關於.NET在中國為什麼工資低的分析 https://www.cnblogs.com/thinkingmore/p/18406244 .NET在中國開發者的薪資偏低,主要因市場需求、技術棧選擇和企業文化等因素所致。歷史上,.NET曾因微軟的閉源策略發展受限,儘管後來推出了跨平臺的.NET ...
  • 在WPF開發應用中,動畫不僅可以引起用戶的註意與興趣,而且還使軟體更加便於使用。前面幾篇文章講解了畫筆(Brush),形狀(Shape),幾何圖形(Geometry),變換(Transform)等相關內容,今天繼續講解動畫相關內容和知識點,僅供學習分享使用,如有不足之處,還請指正。 ...
  • 什麼是委托? 委托可以說是把一個方法代入另一個方法執行,相當於指向函數的指針;事件就相當於保存委托的數組; 1.實例化委托的方式: 方式1:通過new創建實例: public delegate void ShowDelegate(); 或者 public delegate string ShowDe ...