2015-08-09 26 views
0

我正在用PHP編寫的restful API創建一個AngularJS應用程序作爲後端。這是我第一次使用AngularJS和PHP「一起」。在寧靜的PHP API中限制操作

Angular正在跟蹤使用ngCookies模塊的用戶身份驗證。某些操作(例如刪除內容)應只適用於具有特定權限的用戶。我如何確保「普通」用戶或尚未登錄的用戶無法訪問API的刪除操作?

任何想法表示讚賞。

回答

1

下面是我如何做到這一點。

  1. users數據庫表我加列名爲token VARCHAR(36)
  2. 每當用戶登錄:
  3. 我更新與MD5($ip.$email.$logindate)
  4. 令牌lastlogin
  5. 我更新現在我回到用戶對象角度和角度知道令牌。
  6. In Angular $http服務我添加攔截器,並且在做出任何請求之前Authentication標頭已設置。我使用基本身份驗證。我創建了字符串$user_id.'::'.$token

    app.factory('authInterceptor', function($rootScope, $q, appConfig, $injector, $cacheFactory) { 
        function request(config) { 
         if(angular.isDefined($rootScope.currentUser.id)) { 
          config.headers.Authorization = 'Basic ' + 
          window.btoa($rootScope.currentUser.id + ':' + 
          $rootScope.currentUser.token); 
         } 
    
         return config; 
        } 
    
        function response(response) { 
         if(angular.isDefined(response.data.code) && parseInt(response.data.code) == 401) { 
          var UserApi = $injector.get('UserApi'); 
    
          UserApi.logout(); 
    
          $cacheFactory.get('$http').removeAll(); 
    
          UserApi.login(response.data.message) 
           .catch(function() { 
            var $state = $injector.get('$state'); 
            $state.go('app.home'); 
           }); 
         } 
    
         return response || $q.when(response); 
        } 
    
        return { 
         request: request, 
         response: response 
        }; 
    }) 
    

這是我authInterceptor工廠,我插入到應用

app.config(function($httpProvider) { 
    $httpProvider.interceptors.push('authInterceptor'); 
}) 

正在發生的事情有我爲每個請求設置標準Authentication頭,如果用戶被授權。

然後在PHP中,我得到這個頭。我分別獲得用戶ID和令牌。然後我使用用戶ID從DB獲取用戶數據,我擁有令牌和最後登錄日期。現在

我可以比較令牌,看看這個用戶是誰登錄的一個。

不過這也不是絕對安全的。如果有人獲得這個令牌,那麼他可以登錄。這就是使用IP的原因。不僅我在數據庫中檢查了令牌,還檢查了它與IP。我創建了MD5($ip.$email.$logindate),因爲我知道所有的數據並檢查我從角度獲得的令牌。如果它是從不同的IP發送的,它將不會通過。

您還可以在authInterceptor中看到函數響應。每當我有身份驗證問題,我發回HTTP代碼401。現在作爲迴應,我知道認證失敗。我註銷用戶並將他重定向到該網站的主頁。

現在編寫代碼非常簡單。您只需返回必須返回的內容,而不關心沒有經過身份驗證的用戶。

但還有更多。如果您需要某種ACL,那麼您可以根據需要進行設計。在返回特定RESTFull API方法的類中,您可以定義$acl屬性並設置組的名稱。在您檢查身份驗證的同一個地方,您也可以檢查ACL。

請看看我的代碼,這是PHP的後端和前端角

https://github.com/Coach-Hub

這是基本的理念,當然你也可以建立解決這一問題。

+0

這是我一直在尋找的靈感。非常感謝。 – KMK

-1

我不是一個php開發人員。你無法在前端確保這件事。以下是我們在NodeJs應用程序中使用的示例代碼,以驗證用戶是否具有刪除的有效權限。

router.patch('/:id', auth.hasRole(userEnums.roles.admin), controller.update); 
router.post('/create', auth.hasRole(userEnums.roles.admin), controller.create); 
//Checks if the user role meets the minimum requirements of the route 
function hasRole(roleRequired) { 
    if (!roleRequired) throw new Error('Required role needs to be set'); 

    return compose() 
     .use(isAuthenticated()) 
     .use(function meetsRequirements(req, res, next) { 
      if (req.user.role.indexOf(roleRequired) !== -1) { 
       next(); 
      } 
      else { 
       res.send(403); 
      } 
     }); 
} 

這裏auth.hasRole是簡單的方法/中間件,這是一個咖喱設計模式。它檢查使用請求並檢查該用戶是否有有效的刪除權限。在用戶沒有管理員權限的情況下,它會返回未經驗證的錯誤消息。 這是用於管理員和用戶的關係。我們最後還使用另一種策略來驗證用戶。假設我們已經公開我們的刪除API並且任何人都可以刪除它。在這種情況下,我們必須確保活動用戶必須是文檔的所有者。在這種情況下,我們首先獲取文檔的所有者標識並將其與請求的用戶標識進行匹配。如果匹配,則比我們刪除文檔。

BlogPostApiService.destroy(id, _.curry(hasPermission)(req.user)) 
//hasPermission implementation 
function hasPermission(user, blogPost) { 
    return user && (user.hasRole(UserEnums.roles.admin) || (user._id.toString() == blogPost.author.id.toString())); 
} 
+0

這完全沒有意義。他詢問了PHP後端,爲什麼給node.js例子? –

+0

因爲它不可能在客戶端。任何人都可以破解。我建議他可以做什麼樣的實施。而不是給代碼複製粘貼的東西。他必須寫自己的邏輯不復制粘貼從任何地方複製的東西 – xdeepakv

+0

這不是我給的複製/粘貼。這是一個想法。問題是 >如何確保「普通」用戶或尚未登錄的用戶無法訪問API的刪除操作? 所以我認爲他的意思是後端方不是前端方。但實際上問題是兩者如何結合可以解決這個問題。無論如何,PHP傢伙的Nodejs例子無論如何都不是相關的例子。 –