我正在用PHP編寫的restful API創建一個AngularJS應用程序作爲後端。這是我第一次使用AngularJS和PHP「一起」。在寧靜的PHP API中限制操作
Angular正在跟蹤使用ngCookies模塊的用戶身份驗證。某些操作(例如刪除內容)應只適用於具有特定權限的用戶。我如何確保「普通」用戶或尚未登錄的用戶無法訪問API的刪除操作?
任何想法表示讚賞。
我正在用PHP編寫的restful API創建一個AngularJS應用程序作爲後端。這是我第一次使用AngularJS和PHP「一起」。在寧靜的PHP API中限制操作
Angular正在跟蹤使用ngCookies模塊的用戶身份驗證。某些操作(例如刪除內容)應只適用於具有特定權限的用戶。我如何確保「普通」用戶或尚未登錄的用戶無法訪問API的刪除操作?
任何想法表示讚賞。
下面是我如何做到這一點。
users
數據庫表我加列名爲token VARCHAR(36)
MD5($ip.$email.$logindate)
lastlogin
列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的後端和前端角
這是基本的理念,當然你也可以建立解決這一問題。
我不是一個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()));
}
這完全沒有意義。他詢問了PHP後端,爲什麼給node.js例子? –
因爲它不可能在客戶端。任何人都可以破解。我建議他可以做什麼樣的實施。而不是給代碼複製粘貼的東西。他必須寫自己的邏輯不復制粘貼從任何地方複製的東西 – xdeepakv
這不是我給的複製/粘貼。這是一個想法。問題是 >如何確保「普通」用戶或尚未登錄的用戶無法訪問API的刪除操作? 所以我認爲他的意思是後端方不是前端方。但實際上問題是兩者如何結合可以解決這個問題。無論如何,PHP傢伙的Nodejs例子無論如何都不是相關的例子。 –
這是我一直在尋找的靈感。非常感謝。 – KMK