当前位置: 首页 > 面试题库 >

确保用户使用cookieStore和AngularJS登录或注销的最佳实践

刁远
2023-03-14
问题内容

现在,我正在Ruby on
Rails之上构建一个基于AngularJS的应用程序,并使用Devise进行身份验证。当用户成功通过身份验证和身份验证失败时,服务器会正​​确响应。我想我的问题是,使用$
cookieStore,了解用户是否登录的最佳实践是什么?Rails设置了一个名为“
myapp_session”的cookie,但该会话并不一定意味着用户已登录。正在寻找有关如何使用AngularJS保持用户在线/离线管理的想法。无论解决方案如何,我仍将确保需要授权的请求得到后端的授权。


问题答案:

您可以创建一个指令,以在应用程序加载时设置登录用户,例如,请求服务器上的当前用户会话。

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()服务以将用户从Cookie中删除,然后将用户重定向到登录页面。

我使用这种方法,效果很好。您也可以使用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路径处的登录页面。

您会在这里找到一个很好的例子



 类似资料:
  • 我有一个react登录页面,里面有所有的东西(丢失密码、验证电子邮件、重新发送密码等)。然而,我想知道登录后的“最佳实践”应该是什么。 我的反应组件在正确输入用户名/密码后检索“成功”。但是我应该使用反应路由器将我的用户引导到另一个位置(并“输入”一个新的反应应用程序从这里处理事情,或者你们会怎么做?我使用PHP与反应(axios)。我想到了创建一个会话并启动一个新的响应应用程序(在另一个位置)-

  • 问题内容: 我在这里看到了一些有关处理和持久保存枚举式值的最佳方法的问题/讨论(例如,持久化适用于枚举的数据,如何使用NHibernate来持久化枚举),我想问一下一般共识是什么。 特别是: 这些值应如何在代码中处理? 应该如何将它们持久保存到数据库中(作为文本/作为数字)? 不同解决方案的权衡是什么? 注意:我已将本问题中最初包含的解释移至答案。 问题答案: 我试图总结我的理解。 如果有任何更正

  • 我想在我的web应用程序中实现登录/注销,我使用SpringMVC,对于登录/注销,我使用Ehcache和HandlerInterceptorAdapter。基本思想是: > 从下一个请求中,在HandlerInterceptorAdapter的preHandle()方法中从请求对象获取密钥,并签入缓存(如果存在),或者 重定向到登录页面。 用于存储在缓存中的代码为: 现在,对于每一个其他请求,我

  • 用户登录 在用户登录App账号时调用以下登录方法,从而保证用户是以登录身份进行咨询,是区分会话的用户的唯一标识; 游客咨询不需要调用小能login方法,小能会自动生成一个游客身份标识,在客服端游客身份的用户名显示为:“游客+4位数字”。 App完全退出(被杀掉进程), 再次进入时, 在SDK初始化之后, 如果App本身账号是登录用户, 需要重新调用小能SDK登陆接口,同步用户身份【大多是针对App

  • 登录与注销 用户登录 在App登录的地方,调用小能的login方法,目的是传递账号信息,为客服端显示用户信息。在App被杀死之后,sdk会保持用户的登录状态,不需要再次调用登录的方法。 uid作为用户的唯一标识需要保证唯一性,username可根据需要传入手机号、昵称等信息 /** * @param uid 必填,登录用户的id, 只能输入数字、英文字母和"@._—"四种字符,长度小于等于60位

  • 我正在创建一个Ionic应用程序(iOS和带有电容的Android)。我在我的应用程序中添加了Firebase身份验证,但每次退出应用程序时,我都需要重新登录。 我看到了这个,但是没有太多的文档,并且我尝试了它但是没有工作。我不确定我正确地使用了它,或者在正确的地方添加了代码。https://firebase.google.com/docs/auth/web/manage-users?HL=en