控制使用Redis实现高效的账号权限控制(redis 账号权限)
随着越来越多的应用被部署到云上平台,限制访问者并控制账号资源访问权限变得越来越重要。传统的使用session和数据库的方法只能满足有限的需求,Redis作为一个高性能的key-value存储系统,无疑是一个解决问题的良好选择。本文将通过介绍如何利用Redis来实现高效的账号权限控制,减少应用前期开发的冗余代码量。
实现高效的账号权限控制的流程可以分为三个步骤:
– 第一步:使用Redis创建独立的弱口令空间专门存储每个用户的信息,包括用户名、密码、权限列表等,可以使用hash map类型存储用户信息,hashmap的key为用户名,value储存用户信息,用户权限列表可以使用Redis的list类型或者set类型存储。
– 第二步:在网页登录时,使用用户名和密码验证用户身份登录,使用redis的hget命令检索用户名是否存在以及密码是否正确,下面是一个Javascript的示例代码:
// 登录验证
function checkLogin(username, password) { return redis.hget("user:" + username, "password").then(function(result) {
if (!result) return false; return redis.hget("user:" + username, "password") === password;
});}
– 第三步:验证成功后,重新生成redis的session token(令牌),使用redis的setex保存到Redis,并把该令牌返回给用户应用,之后每次请求用户资源时,都必须带上该令牌来验证其身份,若检测到该令牌不存在或者检测到用户对某资源权限不够时,系统可以提示用户重新登录。
// 权限验证
function checkPermission(userId, token, type, resource) { // 先检测token是否存在
return redis.get(token).then(function(result) { // 不存在则重新登录
if (!result) throw new Error('Invalid Token');
// 获取当前用户的权限列表 return redis.lrange('user:' + userId + ':permission', 0, -1).then(function(permissions) {
// 验证当前用户对该资源是否具有权限 if (permissions[type] && permissions[type].indexOf(resource) > -1) {
return true; } else {
throw new Error('Permission denied'); }
}); });
}
以上就是使用Redis来实现高效的账号权限控制的大致流程,它既可以减少应用前期开发的冗余代码量,又可以极大的提升存储和验证session token的速度,使得我们应用更加安全可靠。