AngularJS:在单页应用程序中使用身份验证的基本示例

我是AngularJS的新手,我已经阅读了他们的教程,对它有了初步的了解

我为我的项目准备了一个后端,其中每个REST端点都需要经过身份验证

我想做什么
a、 )我想为我的项目创建一个页面http://myproject.com
b、 )一旦用户在浏览器中点击URL,根据用户是否登录,他将在同一URL下显示主页/视图或登录页面/视图http://myproject.com
c、 )如果用户未登录,它将填写表单,服务器将在会话中设置一个user\u令牌,因此所有进一步向端点发出的请求都将基于user\u令牌

我的困惑
a、 )如何使用AngularJS处理客户端身份验证?我看到这里和这里,但不知道如何使用它们
b、 )如何根据用户是否登录到同一urlhttp://myproject.com

我第一次使用angular.js,真的很困惑如何开始。非常感谢您提供任何建议和/或资源

我创建了一个github回购协议,基本上总结了本文:https://medium.com/opinionated-angularjs/techniques-for-authentication-in-angularjs-applications-7bbf0346acec

ng登录Github回购

普朗克

我会尽可能好地解释,希望我能帮助你们中的一些人:

(1)app.js:在应用程序定义上创建身份验证常量

var loginApp=angular.module(’loginApp’,[‘ui.router’,’ui.bootstrap’])
/*此处定义的有关用户登录的常量*/
.constant(’用户角色'{
全部:“*”,
管理员:’管理员’,
编辑:”编辑”,,
客人:“客人”
}).constant(’AUTH_EVENTS'{
登录成功:“验证登录成功”,
登录失败:“身份验证登录失败”,
注销成功:“身份验证注销成功”,
sessionTimeout:“身份验证会话超时”,
notAuthenticated:“auth not authenticated”,
未授权:“未授权授权”
})

(2)身份验证服务:以下所有功能都在Auth.js服务中实现。$http服务用于与服务器进行身份验证过程的通信。还包含授权功能,即如果允许用户执行特定操作

角度模块(’loginApp’)
.factory(’Auth’、[‘$http’、’$rootScope’、’$window’、’Session’、’Auth_EVENTS’,
函数($http、$rootScope、$window、Session、AUTH\u事件){
authService.login()=[…]
authService.isAuthenticated()=[…]
authService.isAuthorized()=[…]
authService.logout()=[…]
返回授权服务;
} ]);

(3)会话:保存用户数据的单例。这里的实现取决于您

角度.module(’loginApp’)。服务(’Session’,函数($rootScope,用户角色){
this.create=函数(用户){
this.user=用户;
this.userRole=user.userRole;
};
this.destroy=函数(){
this.user=null;
this.userRole=null;
};
归还这个;
});

(4)父控制器:将此视为应用程序的“主”函数,所有控制器从该控制器继承,并且是该应用程序验证的主干。

<body ng controller=“ParentController”>
[...]
&lt/车身>

(5)访问控制:要拒绝某些路由上的访问,必须执行以下两个步骤:

a) 在ui路由器的$stateProvider服务上添加允许访问每个路由的角色的数据,如下所示(同样适用于ngRoute)

.config(函数($stateProvider,用户角色){
$stateProvider.state('dashboard'{
url:“/dashboard”,
templateUrl:'dashboard/index.html',
数据:{
authorizedRoles:[用户\角色.admin,用户\角色.editor]
}
});
})

b) 在$rootScope上。$On(“$stateChangeStart”)添加函数,以防止在用户未经授权的情况下更改状态

$rootScope.$on(“$stateChangeStart”,函数(事件,下一个){
var authorizedRoles=next.data.authorizedRoles;
如果(!Auth.isAuthorized(authorizedRoles)){
event.preventDefault();
如果(Auth.isAuthenticated()){
//用户是不允许的
$rootScope.$broadcast(AUTH_EVENTS.notAuthorized);
}否则{
//用户未登录
$rootScope.$broadcast(AUTH_EVENTS.notAuthenticated);
}
}
});

(6)身份验证拦截器:这已实现,但无法在此代码范围内进行检查。在每个$http请求之后,该拦截器检查状态代码,如果返回以下其中一个,则它广播一个事件以强制用户再次登录

角度模块(’loginApp’)
.factory(’AuthInterceptor’、[‘$rootScope’、’$q’、’Session’、’AUTH_EVENTS’,
函数($rootScope、$q、会话、身份验证事件){
返回{
responseError:函数(响应){
$rootScope.$broadcast({
401:AUTH_EVENTS.notAuthenticated,
403:AUTH_EVENTS.notAuthorized,
419:AUTH_EVENTS.sessionTimeout,
440:AUTH_EVENTS.sessionTimeout
}[答复.状态],答复);
返回$q.reject(响应);
}
};
} ]);

p.S.通过添加directives.js中包含的指令,可以轻松避免第一篇文章中所述的表单数据自动填充错误

p.S.2用户可以轻松调整此代码,以允许查看不同的路线,或显示不打算显示的内容。逻辑必须在服务器端实现,这只是在ng应用程序上正确显示内容的一种方式

发表评论