欢迎大家指导与讨论 : )

   一、  身份验证的意义

  首先呢,网络应用的身份验证的意图在于:保护网站中的重要资源。基于某些原因这些资源并不能公开,比如付费资源(交过钱的用户才能上的网络课程),或者一些管理功能。其次,在AngularJS中推荐使用server来实现验证功能,因为服务是单例,并且全局可注入使用。

   二. 1、 客户端身份验证——保护API访问资源

如果想要对一个会发送受保护的API请求(例如一个服务器可能返回401状态的API请求)的路由进行保护,但又希望可以正常地加载页面,可以简单地通过拦截器来实现

app.config(function($httpProvider){
var interceptor = function($q, $rootScope, Auth){
return {
'response': function(resp){
if(resp.config.url == 'api/login'){
Anth.setToken(resp.data.token);
}
return resp
}
'responseError': function(rejection){
switch(rejection){
case: 401: //...; break;
case: 402: //...; break;
}
}
}
}
})

  二. 2、 客户端身份验证——使用路由定义受保护资源

首先我们需要四样工具。1、 angular常量constant. 2、 $routerProvider配置为每个路由配置权限. 3、 创建一个能操作cookie并判断是否有权限的服务. 4、 $rootScope对路由的监听

  举个简单的例子~ 一天风和日丽, 您要去参观一个藏有各种各样并且价值连城的收藏品的博物馆(用户要进入带有各种各样资源的站点)。博物馆里面呢,有许多不同的展区(站点里不同的路由视图),每个展区都有相应的等级,比如说宝石展区等级是VIP9以上的游客才能进去,而猎物展区等级是VIP2以上的游客就能进去参观了(每个路由配置相应的权限)。而每个游客,在进入博物馆的时候还会获得一张VIP卡,但是这个VIP卡是因人而异的,比如马云是VIP999,而小鹏我是VIP2(每个用户的权限不一样)。博物馆方面为了安全起见,为每个游客都配备了一个随身保镖,这个保镖呢会在你进入不同的展区(进入不同的路由)的时候呢,会让你先在展区门口站一会儿,取出你的VIP卡并和这个展区的等级进行匹对(保镖$rootScope的路由监听,而这个等级匹对的工作便是所构建的服务),只有你的VIP等级大于或者等于展区权限等级,您才能进去展区参观(根据用户权限判断是否能进去该路由)。

  下面是具体的实现方式

  1、 angular常量constant

app.constant('ACCESS_LEVELS', {
pub: 1,
user: 2
});

  2、 $routerProvider配置为每个路由配置权限(注入常量)

app.config(function($routerProvider, ACCESS_LEVELS){
$routerProvider
.when('/', {
templateUrl: 'tem/main.html',
access_level: ACCESS_LEVELS.pub
})
.when('/account', {
templateUrl: 'tem/account.html',
access_level: ACCESS_LEVELS.user
})
.otherwise({redirectTo: '/'})
})

  3、 创建一个能操作cookie并判断是否有权限的服务(注入常量)

app.factory('Auth', function($cookieStore, ACCESS_LEVELS){
var _user = $cookieStore.get('user');
var setUser = function(user){
if(!user.role || user.role < 0){
user.role = ACCESS.LEVELS.pub'
}
_user = user;
$cookieStroe.put('user', _user)
};
return {
isAuthorized: function(lvl){
return _user.role >= lvl
},
setUser: setUser,
isLoggedIn: function(){
return _user ? true : false
},
getUser: function(){
return _user
},
getId: function(){
return _user ? _user.id : null;
},
logout: function(){
$cookieStore.remove('user');
_user = null;
}
}
})

  4、 $rootScope对路由的监听

app.run(function($rootScope, $location, Auth){
$rootScope.$on('$routeChangeStart', function(evt,next,curr){
if(!Auth.isAuthorized(next.$$route.access_level){
//没有访问权限
if(Auth.isLoggedIn()){
//如果登陆了
$location.path('/')
}else{
$location.path('/login');
}
})
})
})

    三、 发送经身份验证的请求

当我们通过了身份验证,并取回了用户授权令牌之后,就可以在向服务器发送的请求中加入令牌

 1、 在请求中加入令牌

$http({
method: 'GET',
url: 'http://myserver.com/api',
params: {
token: Auth.getToken();
}
}).success(function(data){
//....
}).catch(function(reason){
$q.reject(reason)
})

  2、 通过拦截器,未每个请求都加入令牌信息

function($q, $rootScope, Auth){
return {
'request': function(req){
req.params = req.params || {};
if(Session.isAuthenticated() && !req.params.token){
req.params.token = Auth.getToken();
}
return req;
}
}
}

   四、 限制元素显示

<div ng-if="currentUser">Welcome, {{ currentUser.name }</div>
<div ng-if="isAuthorized(userRoles.admin)">You're admin.</div>
<div ng-switch on="currentUser.role">
<div ng-switch-when="userRoles.admin">You're admin.</div>
<div ng-switch-when="userRoles.editor">You're editor.</div>
<div ng-switch-default>You're something else.</div>
</div>

  五、 弹出登录对话框

.directive('loginDialog', function (AUTH_EVENTS) {
return {
restrict: 'A',
template: '<div ng-if="visible"
ng-include="\'login-form.html\'">',
link: function (scope) {
var showDialog = function () {
scope.visible = true;
}; scope.visible = false;
scope.$on(AUTH_EVENTS.notAuthenticated, showDialog);
scope.$on(AUTH_EVENTS.sessionTimeout, showDialog)
}
};
})

  资料参考:

  1. 《AngularJS权威指南》P159

  2.  AngularJS 应用身份认证的技巧 https://blog.coding.net/blog/techniques-for-authentication-in-angular-js-applications?type=hot

AngularJS中的身份验证的更多相关文章

  1. 用Retrofit发送请求中添加身份验证

    用Retrofit发送请求中添加身份验证====================在安卓应用开发中, retrofit可以极大的方便发送http网络请求,不管是GET, POST, 还是PUT, DEL ...

  2. Azure Service Bus 中的身份验证方式 Shared Access Signature

    var appInsights=window.appInsights||function(config){ function r(config){t[config]=function(){var i= ...

  3. 也谈Asp.net 中的身份验证

    钱李峰 的这篇博文<Asp.net中的认证与授权>已对Asp.net 中的身份验证进行了不错实践.而我这篇博文,是从初学者的角度补充了一些基础的概念,以便能有个清晰的认识. 一.配置安全身 ...

  4. [转]Reporting Services 中的身份验证类型

    本文转自:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/cc281310%28v%3dsql.100%2 ...

  5. SQLServer 中的身份验证及登录问题

    SQLServer 中的身份验证及登录问题 by:授客 QQ:1033553122 身份验证 SQL Server 支持两种身份验证模式,即Windows 身份验证模式和混合模式. Windows 身 ...

  6. nancy中的身份验证

    在nancy中,身份验证分为basic ,form ,token,stateless几种,basic和form这里不说了,其中如果是使用cookie来保存身份的, 需要注意的是:cookie有大小的限 ...

  7. Kubernentes中的身份验证

    Kubernentes中的身份验证 kubernetes 系统的各组件需要使用 TLS 证书对通信进行加密,本文档使用 CloudFlare 的 PKI 工具集 cfssl 来生成 Certifica ...

  8. 从零搭建一个IdentityServer——聊聊Asp.net core中的身份验证与授权

    OpenIDConnect是一个身份验证服务,而Oauth2.0是一个授权框架,在前面几篇文章里通过IdentityServer4实现了基于Oauth2.0的客户端证书(Client_Credenti ...

  9. 学学dotnet core中的身份验证和授权-1-概念

    前言 身份验证: Authentication 授权: Authorization net core 中的身份验证和授权这两个部分,是相辅相成的.当初我在学在部分的时候,是看的 net core 官网 ...

随机推荐

  1. 统计整个Xcode工程代码行数

    打开终端,ls 查看目录,用cd命令 定位到工程所在的目录,然后调用以下命名即可把每个源代码文件行数及总数统计出来: find . "(" -name "*.m" ...

  2. 详解 Spotlight on MySQL监控MySQL服务器

    前一章详解了Spotlight on Unix 监控Linux服务器 ,今天再来看看Spotlight on MySQL怎么监控MySQL服务器. 注:http://www.cnblogs.com/J ...

  3. github邮箱验证技巧

    申请的github账号,绑定邮箱之后才能创建库,而反复几次的发送邮件均为收到验证邮件,猜测有两个原因: 1.腾讯邮件服务器屏蔽了github的来信 (腾讯不会这么狭隘的,×) 2.自己邮箱的域名黑名单 ...

  4. Access字段类型“查阅向导”

    1.显示控件有:“列表框”和“组合框”两种 2.组合框:第一个字段为“填充字段” 3.通过查阅向导建立的会自动添加“关系”(外键),因此在删除或修改字段时需要先删除二者关系,最好不通过“查阅向导”建立 ...

  5. 用批处理来自动化项目编译及部署(附Demo)

    阅读目录 本文版权归mephisto和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作. 介绍 详细 处理 结论 Demo下载 介绍 一个项目从立项开始,可能就已经根据公司的配置模板将 ...

  6. 烂泥:php5.6源码安装与apache集成

    本文由秀依林枫提供友情赞助,首发于烂泥行天下. apache对php的支持是通过apache的mod_php5模块来支持的,这点与nginx不同.nginx是通过第三方的fastcgi处理器才可以对p ...

  7. UEFI安装Kali Linux 1.1.0记录

    现在使用Kali Linux 1.1.0, UEFI启动,使用Fcitx的拼音输入法,词库实在不爽,将就写一写. 本文地址: http://www.cnblogs.com/go2bed/p/42954 ...

  8. css3常用动画+动画库

    一.animates.css animate.css是来自dropbox的工程师Daniel Eden开发的一款CSS3的动画效果小类库.包含了60多款不同类型的CSS3动画,包括:晃动,闪动,各种淡 ...

  9. [转]ORA-01034: ORACLE not available如何解决

    本文转自:http://www.cnblogs.com/zhwl/p/3726003.html 一个小小的问题,让我折腾了一个上午,下午三点彻底解决了,分享一个给大家解决方法,尽管在测试服务器上,但是 ...

  10. Remove Duplicates From Sorted Array

    Remove Duplicates from Sorted Array LeetCode OJ Given a sorted array, remove the duplicates in place ...