2016-11-21 45 views
0

我有一個應用程序,我使用cookie來存儲訪問令牌,並通過使用API​​ getUser(accessToken)獲取用戶詳細信息。考慮一種情況,用戶已經登錄,我在Cookie中有訪問令牌,但沒有用戶詳細信息。當用戶試圖訪問一個頁面時,可以說/ abc,我應該如何解決這個問題。
這是我在做什麼, 我在運行模塊中有getUser(accessToken)API。我在跑步區也有類似$rootScope.$on('$stateChangeStart', fuction(){});的活動。 當用戶嘗試訪問/ abc時,在解析中檢查用戶角色以確認用戶是否有權訪問此頁面。在得到getUser()API的響應之前,我會檢查用戶角色。 我應該如何解決這個問題?問題在獲取用戶詳細信息和檢查中的角色

+0

而你的代碼是... –

+0

如果你在cookie中有有效的accessToken,爲什麼不把你的用戶信息保存在localStorage中? –

+0

目前我正在那樣做。但我想知道如何在不保存本地存儲的情況下完成此操作。 – simon

回答

0

我認爲使用用戶角色是最好的選擇。 您可以實現用戶角色,像這樣爲常量:

.constant('USER_ROLES', { 
    all: '*', 
    admin: 'admin', 
    editor: 'editor', 
    guest: 'guest' 
}) 

約常量一個很好的事情是,他們可以注射般的服務,這使得它們很容易在你的單元測試嘲笑。它還允許您稍後重命名它們(更改值),而無需更改一堆文件。

相關授權(訪問控制)邏輯在服務最好分組:

.factory('AuthService', function ($http, Session) { 
    var authService = {}; 

    authService.login = function (credentials) { 
    return $http 
     .post('/login', credentials) 
     .then(function (res) { 
     Session.create(res.data.id, res.data.user.id, 
         res.data.user.role); 
     return res.data.user; 
     }); 
    }; 

    authService.isAuthenticated = function() { 
    return !!Session.userId; 
    }; 

    authService.isAuthorized = function (authorizedRoles) { 
    if (!angular.isArray(authorizedRoles)) { 
     authorizedRoles = [authorizedRoles]; 
    } 
    return (authService.isAuthenticated() && 
     authorizedRoles.indexOf(Session.userRole) !== -1); 
    }; 

    return authService; 
}) 

大多數時候,你會希望禁止訪問整個頁面,而不是隱藏單個元素的時間。在路由(或狀態,使用UI路由器)上使用自定義數據對象時,我們可以指定哪些角色應該被允許訪問。此示例使用UI路由器樣式,但對於ngRoute也適用。接下來,我們需要在每次路線改變(即用戶導航到另一頁面)時檢查該屬性。這包括聽$ routeChangeStart(用於ngRoute)或$ stateChangeStart(對於UI路由器)事件:

.run(function ($rootScope, AUTH_EVENTS, AuthService) { 
    $rootScope.$on('$stateChangeStart', function (event, next) { 
    var authorizedRoles = next.data.authorizedRoles; 
    if (!AuthService.isAuthorized(authorizedRoles)) { 
     event.preventDefault(); 
     if (AuthService.isAuthenticated()) { 
     // user is not allowed 
     $rootScope.$broadcast(AUTH_EVENTS.notAuthorized); 
     } else { 
     // user is not logged in 
     $rootScope.$broadcast(AUTH_EVENTS.notAuthenticated); 
     } 
    } 
    }); 
}) 

當用戶無權訪問該頁面(因爲他沒有登錄或沒有正確的角色),將阻止轉換到下一頁,因此用戶將停留在當前頁面上。

+0

這是完美的。但我的要求是不同的。登錄()API後,我會得到令牌,存儲在會話中。然後,我將通過調用不存儲在本地的getUser()API來獲取用戶角色和詳細信息。所以當我刷新我沒有用戶的細節和角色。所以每次我都必須得到這個在run block中被調用的細節。那麼這段代碼將不起作用。 你能幫我怎麼做嗎? – simon

+0

難道你不能得到用戶的詳細信息,並將它們存儲在一個會話? – Matheno

+0

這是我們的要求。我只能存儲令牌。 :( – simon

相關問題