現在,我正在基於Ruby on Rails構建基於AngularJS的應用程序,並使用Devise進行身份驗證。當用戶認證成功並且身份驗證失敗時,服務器響應正常。我想我的問題是,使用$ cookieStore,知道用戶是否登錄的最佳做法是什麼?有一個由Rails設置的名爲「myapp_session」的cookie,但該會話並不一定意味着用戶已登錄。尋找有關如何使用AngularJS保持用戶在線/離線管理的想法。不管解決方案如何,我仍然會確保需要授權的請求獲得後端的授權。確保用戶使用cookieStore和AngularJS登錄或註銷的最佳實踐
22
A
回答
37
您可以創建一個指令,在應用程序加載時設置記錄的用戶,例如請求服務器上的當前用戶會話。
angular.module('Auth', [
'ngCookies'
])
.factory('Auth', ['$cookieStore', function ($cookieStore) {
var _user = {};
return {
user : _user,
set: function (_user) {
// you can retrive a user setted from another page, like login sucessful page.
existing_cookie_user = $cookieStore.get('current.user');
_user = _user || existing_cookie_user;
$cookieStore.put('current.user', _user);
},
remove: function() {
$cookieStore.remove('current.user', _user);
}
};
}])
;
而在你run
方法設置AppController
:
.run(['Auth', 'UserRestService', function run(Auth, UserRestService) {
var _user = UserRestService.requestCurrentUser();
Auth.set(_user);
}])
當然,如果到服務器的任何請求返回Http Status 401 - Unauthorized
,你需要調用Auth.remove()
服務從餅乾刪除用戶和重定向用戶登錄頁面。
我使用這種方法,效果很好。您也可以使用localStorage
,但用戶數據將會持續很長時間。除非您爲此身份驗證設置了到期日期,否則我並不認爲這是最佳做法。
記住總是驗證您的服務器站點的用戶憑據=)
[編輯]
要收聽401 - Unauthorized
服務器響應,你可以把一個攔截器,在您的$http
要求,如這樣的:
.config(['$urlRouterProvider', '$routeProvider', '$locationProvider', '$httpProvider', function ($urlRouterProvider, $routeProvider, $locationProvider, $httpProvider) {
$urlRouterProvider.otherwise('/home');
var interceptor = ['$location', '$q', function ($location, $q) {
function success(response) {
return response;
}
function error(response) {
if (response.status === 401) {
$location.path('/login');
return $q.reject(response);
}
else {
return $q.reject(response);
}
}
return function (promise) {
return promise.then(success, error);
};
}];
$httpProvider.responseInterceptors.push(interceptor);
}])
與401
響應每一個電話,用戶會被重定向在/login
PA到登錄頁面日。
你會發現一個很好的例子here
4
您可以
$cookieStore.put('logged-in', some_value)
設置Cookie在你登錄的回調然後檢查時,他們與
.run(function($cookieStore) {
if ($cookieStore.get('logged-in') === some_value) {
let him enter
}
else {
you shall not pass
}
});
有進入您的網站可能會更「正確」的方式,但這是有效的。
2
如果您在通過接受的答案工作中的問題,要警惕,隨着角1.3,添加新的攔截器的正確方法是將其添加到$ httpProvider.interceptors,所以不是:
$httpProvider.responseInterceptors.push(interceptor);
使用:
$httpProvider.interceptors.push(interceptor);
相關問題
- 1. 註冊和登錄最佳實踐
- 2. JQuery Mobile - 用戶登錄最佳實踐
- 3. 用戶登錄審覈 - 最佳實踐
- 4. OAUTH和iOS應用最佳實踐:讓用戶登錄?
- 5. Php登錄 - 最佳實踐
- 6. Facebook登錄最佳實踐
- 7. 用戶內容目錄最佳實踐
- 8. 鐵路由器登錄和註冊最佳實踐
- 9. 記錄「開銷」最佳實踐?
- 10. PHP:保存用戶在登錄後選擇的角色的最佳實踐
- 11. ASP最佳實踐開銷
- 12. 使用PHP + Phonegap進行用戶註冊的最佳實踐
- 13. JSF註銷頁面 - 最佳實踐:使用一個公共bean是否正確?
- 14. 確定用戶是否登錄或註銷
- 15. iOS + PHP登錄最佳實踐
- 16. 最佳實踐登錄功能
- 17. 的登錄註冊家裏IOS最佳實踐
- 18. 的登錄和註銷使用Facebook SDK
- 19. 如何從Facebook註銷或使用Parse和Swift撤銷登錄
- 20. 賬戶用戶名的最佳實踐?
- 21. 使用AJAX登錄/註銷
- 22. 使用UITabBarController登錄/註銷?
- 23. 使用HtmlTextWriter和string.Format的最佳實踐
- 24. 最佳實踐:包括「使用Twitter登錄」按鈕(Android)
- 25. 哪一個是最佳實踐:系統中所有登錄用戶或多個用戶帳戶的root帳戶
- 26. AngularJS服務和承諾最佳實踐
- 27. 最佳實踐使用PDO
- 28. 最佳實踐使用Q.promise
- 29. 最佳實踐使用
- 30. ServiceStack.Redis使用最佳實踐
這是一個夢幻般的迴應。感謝您的洞察力。這很有用。 –
我得到一個關於'未知的提供者:$ urlRouterProvider'的錯誤。 –
你使用angular v1.2嗎? –