热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

运用service完成登录、权限掌握

文章泉源:http:blog.ddlisting.com官网关于登录、用户权限的引见只需一段简朴的申明,并没有细致申明怎样运用service完成权限掌握。下面地点是官网的说法:ht

文章泉源:http://blog.ddlisting.com

官网关于登录、用户权限的引见只需一段简朴的申明,并没有细致申明怎样运用service完成权限掌握。下面地点是官网的说法:

https://guides.emberjs.com/v2.6.0/applications/services/

An Ember.Service is a long-lived Ember object that can be made available in different parts of your application.
Services are useful for features that require shared state or persistent connections. Example uses of services might include:

  1. User/session authentication.

  2. Geolocation.

  3. WebSockets.

  4. Server-sent events or notifications.

  5. Server-backed API calls that may not fit Ember Data.

  6. Third-party APIs.

  7. Logging.

service是啥东西呢?简朴讲service也是一个Ember.Object只不过这个对象与一般的对象有点不一样。起首这类对象是放在文件夹appName/app/services目录下。其次放在这个目录下的对象Ember会自动注册(registered)或许注入(injection)到Ember项目中。这类对象有以下2个特征

  1. 对象声明周期是session级别的

  2. 在Ember项目标任何地方都能够挪用

恰是基于这两个特征才完成权限的掌握。最简朴的例子就是用户的登录题目。现在也有现成的插件完成权限的掌握,请看运用ember-simple-auth完成Ember.js运用的权限掌握所形貌的要领,然则假如要根据本身项目须要去完成权限掌握那末又怎样做呢?

本篇博文将为你引见怎样运用service完成权限掌握,我会建立一个简朴的登录示例加以申明。若有不妥迎接留言斧正。

构建项目

ember new secretcodez
cd secretcodez
ember s

考证项目是不是建立胜利http://localhost:4200。看到Welcome to Ember申明项建立胜利。下面建立演示所需文件。

建立文件

ember g route secret
ember g route login
ember g route application
ember g component secret-page
ember g component login-page
ember g model code description:string
ember g adapter application

项目演示用到的文件基础就这些。

secret页面

{{! app/templates/secret.hbs }}
{{secret-page model=model}}

{{! app/tempalates/components/secret-page.hbs}}

secret page



    {{#each model as |code|}}

  • {{code.description}}

  • {{/each}}

后端效劳

为了测试建立一个简朴的后端效劳顺序,运用的是Node,然后写死一些测试数据。就没必要动牛刀,建立一个数据库了!

ember g server
npm install
npm install body-parser --save-dev

实行完ember g server后,在APP目录下建立一个nodejs顺序,自动植入到当前项目中,接见的domain和port与ember接见域名端口一致。

翻开index.js编辑后端要求监听。

// server/index.js
const bodyParser = require('body-parser');
module.exports = function(app) {
app.use(bodyParser.urlencoded({ extended: true }));
app.get('/api/codes', function (req, res) {
return res.status(200).send({
codes: [
{ id:1, description: '为了测试建立一个简朴的后端效劳顺序,运用的是Node,然后写死一些测试数据。就没必要动牛刀,建立一个数据库了!' },
{ id:2, description: '本篇博文将为你引见怎样运用service完成权限掌握,我会建立一个简朴的登录示例加以申明。若有不妥迎接留言斧正。' }
]
});
});
};

既然用到本身的后端效劳那末对应的你就须要自定义适配器了。简朴起见就建立RESTAdapter适配器吧。JSONAPIAdapter适配器相对贫苦点,须要花样化数据为json api。

// app/adapters/application.js
export default DS.RESTAdapter.extend({
namespace: 'api'
});

运用属性namespace指定URL前缀,比方要求URL为http://localhost:4200/api/codes,自动在要求上到场前缀api

修正路由,猎取后端数据。

// app/routes/secret.js
export default Ember.Route.extend({
model() {
// 返回后端数据,这些数据直接从 server/index.js 猎取
return this.store.findAll('code');
}
});

从新启动项目。搜检项目是不是有毛病!假如启动没题目,那末接见http://localhost:4200/secret你也会获得以下截图的结果。

《运用service完成登录、权限掌握》

从截图中能够看到发送一个要求http://localhost:4200/api/codes,而且从这个要求中猎取到效劳端返回的数据。你能够直接把这个URL放到浏览器地点栏实行,能够清晰的看到返回的数据。数据的花样是一般的json花样。

现在的结果是任何人都能够接见,还没完成权限掌握的结果。那末怎样去完成呢?不知道你是不是看过前面的文章adapter与serializer运用示例,假如你看过内里有引见过在要求头加考证信息这个小结。假如我也想这么完成掌握接见API的权限怎样做呢?

修正效劳端,到场权限校验

// 阻拦 /api/codes 要求
app.get('/api/codes', function(req, res) {
//猎取数据之前先校验要求者是不是有权接见资本
// 做一个异常简朴的推断,假如要求的头信息不等于BLOG.DDLISTING.COM则以为无权限
if (req.headers['authorization'] !== 'BLOG.DDLISTING.COM') {
return res.status(403).send('您无权接见此资本!')
}
// 直接返回准确状况和测试数据
return res.status(200).send({
codes: [
{ id:1, description: '为了测试建立一个简朴的后端效劳顺序,运用的是Node,然后写死一些测试数据。就没必要动牛刀,建立一个数据库了!' },
{ id:2, description: '本篇博文将为你引见怎样运用service完成权限掌握,我会建立一个简朴的登录示例加以申明。若有不妥迎接留言斧正。' }
]
});
})

注重:_代码只列出重要部份,其他的稳定。_
在代码中到场了简朴的权限校验,一般authorization的值应该是变化的或许是每一个用户都是唯一的,比方oauth2中的access token。当你再次接见之前的资本http://localhost:4200/secret能够看到,报错了,提醒无权接见。以下截图:

《运用service完成登录、权限掌握》

明显如许的校验是没啥意义的,那末假如你也想模仿Oauth2也天生一个唯一的access token,你能够要求之前起首猎取一个access token。然则这个access token不是随意就可以猎取的,须要经由过程登录胜利后才猎取到。下面到场模仿登录的顺序。仍然是修正server/index.js

// 登录
app.post('/api/login', function(req, res) {
//推断用户名和暗码是不是准确,这里就直接推断字符串了,现实中一般是经由过程查询数据去推断登录的用户是不是存在
if (req.body.username === 'blog.ddlisting.com'
&& req.body.password === 'yes') {
res.send({ access_token: 'BLOG.DDLISTING.COM' });
} else {
res.status(400).send({ error: '猎取token毛病!' });
}
});

有了后端的效劳以后明显我们须要在前端增添一个登录的表单,供应用户登录而且登录胜利以后还要把猎取到的access_token保留好,在发送要求的时刻设置到要求的头。这个时刻就须要用到service了!!

登录

登录表单

{{! app/templates/login.hbs 登录}}
{{login-page}}

{{! app/templates/components/login-page.hbs 登录表单}}
{{link-to '点击检察有权才接见的资本' ’secret}}

登录



默许的用户名和暗码为:blog.ddlisting.com/yes



{{input type="text" value=username placeholder='blog.ddlisting.com'}}
{{input type="password" value=password placeholder="暗码"}}



登录处置惩罚

在组件类中增加处置惩罚登录的action。

// app/components/login-page.js
import Ember from 'ember';
export default Ember.Component.extend({
authManager: Ember.inject.service(), //注入servi'auth-manager'ce
actions: {
authenticate() {
const { username, password } = this.getProperties('username', 'password');
//挪用service类中的authenticate要领校验登录的用户
this.get('authManager').authenticate(username, password),then(() => {
console.log('登录胜利');
}, (err) => {
console.log('登录失利');
});
}
}
});

在这个类中运用了service类,而且挪用此类中的authenticate要领。代码中的属性authManager就是一个service实例。下面定义service类。

ember g service auth-manager

// app/serivces/auth-manager.js
import Ember from 'ember';
export default Ember.Service.extend({
accessToken: null,
// 推断accessToken是不是是空
isAuthenticated: Ember.computed.bool('accessToken'),
// 提议要求校验登录用户
authenticate(username, password) {
return Ember.$.ajax({
method: 'post',
url: '/api/login',
data: { username: username, password: password }
}).then((res) => {
// 设置返回的access_token到service类的属性中
this.set('accessToken', res.access_token);
}, (err) => {
//登录失利
});
},
invalidate() {
this.set('accessToken', null);
}
});

在组件类login-page.js中并没有直接发要求校验用户是不是登录胜利,而是经由过程挪用serivce类的要领去校验,目标是为了把返回的值保留到service的属性中,这也是利用它的特征。要领invalidate的目标是实行退出登录操纵,把保留到service属性中的值置空,使得盘算属性isAuthenticated返回false

一切都定义好了下面就是怎样运用这个service属性了!修正适配器的代码,在要求头中到场accessToken

// import JSONAPIAdapter from 'ember-data/adapters/json-api';
import DS from 'ember-data';
// 不运用默许适配器JSONAPIAdapter,而是运用RESTAdapter
export default DS.RESTAdapter.extend({
namespace: 'api', //接见要求前缀: http://localhost:4200/api/codes
// 到场要求头
authManager: Ember.inject.service('auth-manager'),
headers: Ember.computed('authManager.accessToken', function() {
//动态返回accessToken的值
return {
'authorization': `${this.get('authManager.accessToken')}`
};
})
});

到此代码基础写完了,为了处置惩罚效劳端返回的毛病直接在application路由中阻拦error事宜,在这个事宜中处置惩罚毛病的状况。
申明:一切的子路由的error事宜都邑自动冒泡到路由applicationerror事宜中。

// app/routes/application.js
import Ember from 'ember';
export default Ember.Route.extend({
actions: {
// 处置惩罚一切的error事宜
error(reason, transition) {
//假如涌现毛病直接转到登录界面
this.transitionTo('login');
return false;
}
}
});

项目重启终了(是手动停止在启动,不然会涌现service未定义的状况)以后能够看到界面直接跳转到了登录页面,完成了简朴的权限阻拦(无权先登录)。

《运用service完成登录、权限掌握》

未登录直接点击链接“点击检察有权才接见的资本”结果

《运用service完成登录、权限掌握》

能够看到浏览器掌握台打印信息显现资本无权接见,返回的代码是403

输入毛病的用户名或暗码的状况:

《运用service完成登录、权限掌握》

登录胜利再接见受权资本

《运用service完成登录、权限掌握》

登录胜利以后再点击链接能够一般接见了,而且准确看到后端返回的数据。

纵然你点击链接“点击检察有权才接见的资本”也照样会跳转回登录页面。那末最先测试登录后的结果,在表单中输入准确的用户名和暗码。点击登录后跳转到了

退出

有登录就会有退出,退出相对简朴,只需销毁了service类中的属性accessToken值即可。

{{! app/tempalates/components/secret-page.hbs}}

secret page



    {{#each model as |code|}}

  • {{code.description}}

  • {{/each}}




// app/components/secret-page.js
import Ember from 'ember';
export default Ember.Component.extend({
//注入service
authManager: Ember.inject.service('auth-manager'),
actions: {
invalidate() {
this.get('authManager').invalidate(); //退出登录状况
//临时粗犷处置惩罚,直接强迫革新,从新进入application路由触发error事宜,再次推断是不是登录
location.reload();
}
}
});

关于退出事宜的处置惩罚就比较简朴粗犷了,直接革新页面,因为属性authManager的值已设置为null所以提议要求的时刻是无权限的会再次触发error事宜,然后跳转到登录页面。

到这里,基础上完成了一个简朴的权限掌握功用。例子比较简朴,然则处置惩罚的思绪大体上是如许做的,能完成如许的功用是基于service类的特征。也愿望读者能经由过程本例明白晓得怎样运用service

项目代码:https://github.com/ubuntuvim/secretcodez,有疑问迎接给我留言。
您的支撑是我继承写作的最大动力,感谢!!


推荐阅读
  • CF:3D City Model(小思维)问题解析和代码实现
    本文通过解析CF:3D City Model问题,介绍了问题的背景和要求,并给出了相应的代码实现。该问题涉及到在一个矩形的网格上建造城市的情景,每个网格单元可以作为建筑的基础,建筑由多个立方体叠加而成。文章详细讲解了问题的解决思路,并给出了相应的代码实现供读者参考。 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • 本文详细解析了JavaScript中相称性推断的知识点,包括严厉相称和宽松相称的区别,以及范例转换的规则。针对不同类型的范例值,如差别范例值、统一类的原始范例值和统一类的复合范例值,都给出了具体的比较方法。对于宽松相称的情况,也解释了原始范例值和对象之间的比较规则。通过本文的学习,读者可以更好地理解JavaScript中相称性推断的概念和应用。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文介绍了九度OnlineJudge中的1002题目“Grading”的解决方法。该题目要求设计一个公平的评分过程,将每个考题分配给3个独立的专家,如果他们的评分不一致,则需要请一位裁判做出最终决定。文章详细描述了评分规则,并给出了解决该问题的程序。 ... [详细]
  • 本文介绍了Python爬虫技术基础篇面向对象高级编程(中)中的多重继承概念。通过继承,子类可以扩展父类的功能。文章以动物类层次的设计为例,讨论了按照不同分类方式设计类层次的复杂性和多重继承的优势。最后给出了哺乳动物和鸟类的设计示例,以及能跑、能飞、宠物类和非宠物类的增加对类数量的影响。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文记录了在vue cli 3.x中移除console的一些采坑经验,通过使用uglifyjs-webpack-plugin插件,在vue.config.js中进行相关配置,包括设置minimizer、UglifyJsPlugin和compress等参数,最终成功移除了console。同时,还包括了一些可能出现的报错情况和解决方法。 ... [详细]
  • 本文介绍了一个适用于PHP应用快速接入TRX和TRC20数字资产的开发包,该开发包支持使用自有Tron区块链节点的应用场景,也支持基于Tron官方公共API服务的轻量级部署场景。提供的功能包括生成地址、验证地址、查询余额、交易转账、查询最新区块和查询交易信息等。详细信息可参考tron-php的Github地址:https://github.com/Fenguoz/tron-php。 ... [详细]
  • 本文介绍了Sencha Touch的学习使用心得,主要包括搭建项目框架的过程。作者强调了使用MVC模式的重要性,并提供了一个干净的引用示例。文章还介绍了Index.html页面的作用,以及如何通过链接样式表来改变全局风格。 ... [详细]
  • 本文讨论了微软的STL容器类是否线程安全。根据MSDN的回答,STL容器类包括vector、deque、list、queue、stack、priority_queue、valarray、map、hash_map、multimap、hash_multimap、set、hash_set、multiset、hash_multiset、basic_string和bitset。对于单个对象来说,多个线程同时读取是安全的。但如果一个线程正在写入一个对象,那么所有的读写操作都需要进行同步。 ... [详细]
author-avatar
速度向前迈进
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有