AngularJS页面传参的5种方式(2)

举例:应用的Authentication(授权)。用户登录后,后端传回一个时限性的token,该用户下次访问应用,通过检测token和相关参数,可获取用户权限,因而无须再次登录即可进入相应页面(Automatically Login)。其次所有的APIs都需要在HTTP header里注入token才能与服务器传输数据。此时我们看到token扮演一个重要角色:(a)用于检测用户权限,(b)保证前后端数据传输安全性。以下实例中使用GitHub - gsklee/ngStorage: localStorage and sessionStorage done right for AngularJS.和GitHub - Narzerus/angular-permission: Simple route authorization via roles/permissions。

(1)定义一个名为auth.service.js的factory,用于处理和authentication相关的业务逻辑,比如login,logout,checkAuthentication,getAuthenticationParams等。此处略去其他业务,只专注Authentication的部分。

(function() { 'use strict'; angular .module('myApp') .factory('authService', authService); /** @ngInject */ function authService($http, $log, $q, $localStorage, PermissionStore, ENV) { var apiUserPermission = ENV.baseUrl + 'user/permission'; var authServices = { login: login, logout: logout, getAuthenticationParams: getAuthenticationParams, checkAuthentication: checkAuthentication }; return authServices; //////////////// /** * 定义处理错误函数,私有函数。 * @param {type} xxx * @returns {*} * @private */ function handleError(name, error) { return $log.error('XHR Failed for ' + name + '.\n', angular.toJson(error, true)); } /** * 定义login函数,公有函数。 * 若登录成功,把服务器返回的token存入localStorage。 * @param {type} xxx * @returns {*} * @public */ function login(loginData) { var apiLoginUrl = ENV.baseUrl + 'user/login'; return $http({ method: 'POST', url: apiLoginUrl, params: { username: loginData.username, password: loginData.password } }) .then(loginComplete) .catch(loginFailed); function loginComplete(response) { if (response.status === 200 && _.includes(response.data.authorities, 'admin')) { // 将token存入localStorage。 $localStorage.authtoken = response.headers().authtoken; setAuthenticationParams(true); } else { $localStorage.authtoken = ''; setAuthenticationParams(false); } } function loginFailed(error) { handleError('login()', error); } } /** * 定义logout函数,公有函数。 * 清除localStorage和PermissionStore中的数据。 * @public */ function logout() { $localStorage.$reset(); PermissionStore.clearStore(); } /** * 定义传递数据的setter函数,私有函数。 * 用于设置isAuth参数。 * @param {type} xxx * @returns {*} * @private */ function setAuthenticationParams(param) { $localStorage.isAuth = param; } /** * 定义获取数据的getter函数,公有函数。 * 用于获取isAuth和token参数。 * 通过setter和getter函数,可以避免使用第四种方法所提到的$watch变量。 * @param {type} xxx * @returns {*} * @public */ function getAuthenticationParams() { var authParams = { isAuth: $localStorage.isAuth, authtoken: $localStorage.authtoken }; return authParams; } /* * 第一步: 检测token是否有效. * 若token有效,进入第二步。 * * 第二步: 检测用户是否依旧属于admin权限. * * 只有满足上述两个条件,函数才会返回true,否则返回false。 * 请参看angular-permission文档了解其工作原理https://github.com/Narzerus/angular-permission/wiki/Managing-permissions */ function checkAuthentication() { var deferred = $q.defer(); $http.get(apiUserPermission).success(function(response) { if (_.includes(response.authorities, 'admin')) { deferred.resolve(true); } else { deferred.reject(false); } }).error(function(error) { handleError('checkAuthentication()', error); deferred.reject(false); }); return deferred.promise; } } })();

(2)定义名为index.run.js的文件,用于在应用载入时自动运行权限检测代码。

(function() { 'use strict'; angular .module('myApp') .run(checkPermission); /** @ngInject */ /** * angular-permission version 3.0.x. * https://github.com/Narzerus/angular-permission/wiki/Managing-permissions. * * 第一步: 运行authService.getAuthenticationParams()函数. * 返回true:用户之前成功登陆过。因而localStorage中已储存isAuth和authtoken两个参数。 * 返回false:用户或许已logout,或是首次访问应用。因而强制用户至登录页输入用户名密码登录。 * * 第二步: 运行authService.checkAuthentication()函数. * 返回true:用户的token依旧有效,同时用户依然拥有admin权限。因而无需手动登录,页面将自动重定向到admin页面。 * 返回false:要么用户token已经过期,或用户不再属于admin权限。因而强制用户至登录页输入用户名密码登录。 */ function checkPermission(PermissionStore, authService) { PermissionStore .definePermission('ADMIN', function() { var authParams = authService.getAuthenticationParams(); if (authParams.isAuth) { return authService.checkAuthentication(); } else { return false; } }); } })();

(3)定义名为authInterceptor.service.js的文件,用于在所有该应用请求的HTTP requests的header中注入token。关于AngularJS的Interceptor,请参看AngularJS。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wwydsd.html