后端认证鉴权

article/2025/9/19 7:17:08

        之前我们把redis缓存工具模块做好了、下面结合RBAC权限模型,我们来进行用户的认证鉴权设计。关于RBAC权限模型在之前的文章跟网上都有很多很详细的描述,这里就简单说一下、就是通过用户关联角色(多对多)、角色关联权限(多对多)、并且大部分系统还在角色与角色之间做了上下级关系。用来控制下级角色不能拥有上级角色没有的权限。有些系统还是组合权限的形式、给机构(部门)也跟角色挂钩。具体的根据业务需求来做就好了、反正最后我们的目的就是通过URL跟用户的token来校验当前用户是否拥有该URL的权限。

        Spring Security跟shiro等安全框架我们就不使用了、直接使用URL在网关进行权限验证就好。首先先来看看我们的认证、然后在看授权。

登录认证

 

        在用户进行登录的时候、我们就不使用传统的cookie来存储用户信息了、而是使用token来进行存储。这里的token可以是jwtToken也可以是我们自定义的token、需要注意的是自定义的token是需要对返回的token内容进行加密的。请求上来过后、需要先解密token在进行认证。

        这里我们需要对token的内容做一些设计、保证唯一性(比如雪花字符串、UUID)的同时、要把用户ID、生成时间等信息也存储进去、过期时间则不需要了(当然也可以加上去、用来提示token过期)。过期时间由redis来进行管理。按照一定的组合规则来组装token、比如使用@来分割token字符串。拼接好过后,在使用AES、SM2等对称加密算法对token进行加密。当然AES算法记得是使用CBC模式,并且长度要128位才行,否则容易被破解。

        登录成功后、在返回token之前记得将用户的个人信息、角色信息缓存到redis当中去。并记得设置key的时效。不能长期有效的存储。

URL鉴权

         通过上面的登录、我们已经将用户的个人信息、角色信息都缓存进去了。看一下上面我们设计的模式是用户关联角色、角色关联权限。那么现在拿到了用户角色信息只需要加上角色权限的信息就能鉴权了。

初始化角色权限信息

        在系统启动的时候、我们需要对角色的权限做一次初始化动作。只需要实现CommandLineRunner接口即可:

/*** 启动执行权限初始化*/
@Component
@Slf4j
@RequiredArgsConstructor
public class AuthCommandLineRunnerImpl implements CommandLineRunner {private final RedisDao<String, OrgAuth> orgAuthRedisDao;private final RedisDao<String, RoleAuth> roleAuthRedisDao;@Overridepublic void run(String... args){try {initRoleAuth();log.debug(">>>>>>>>>>>>>>>>>>>>初始化业务角色权限成功");}catch (Exception e){log.error("初始化权限出错:{}",e.toString());}}}

         需要注意的是、我们在网关进行鉴权时、只能拿到用户角色、权限、跟URI。那么最快的访问方式应该是角色编码+URI作为redis缓存的key。鉴权的时候只需要拿到用户的角色编码+URL去redis获取、获取到了就有权限、获取不到就没有权限。

初始化设置角色权限

/*** 设置URI权限* @param list* @param key	CacheConstant.AUTH_ROLE_KEY+角色编码+URI*/
private void setUrlAuth(List<Auth> list,String key){if(list == null || list.size() == 0){return;}String authUri = null;for(Auth a : list){authUri = a.getAuthUri();if(StringUtils.isNotBlank(authUri)){authRedisDao.setKey(key+":"+authUri.replaceAll("\\/","-"),1);}}
}

验证角色权限

/*** 角色鉴权* @param user* @return*/
private boolean roleAuth(UserInfo user,String uri){List<String> roleList = user.getRoleList();int size = roleList.size();for(int i=0;i<size;i++){// 遍历角色权限if(auth(roleList.get(i),uri)){return true;}}return false;
}
/*** 权限匹配* @param code  编码* @param uri   鉴权的uri* @return*/
private boolean auth(String code,String uri){uri = uri.replaceAll("\\/","-");Integer a = authRedis.getValue(CacheConstant.AUTH_ROLE_KEY+code+":"+uri);if(a == null || a.intValue() != 1){// 没有权限return false;}return true;
}


http://chatgpt.dhexx.cn/article/qYLCi2qY.shtml

相关文章

Postman鉴权

Ok, 今天我们来学习 一下 鉴权 鉴权&#xff08;authentication&#xff09; 是指验证用户是否拥有访问系统的权利。传统的鉴权是通过密码来验证的。这种方式的前提是&#xff0c;每个获得密码的用户都已经被授权。在建立用户时&#xff0c;就为此用户分配一个密码&#xff0c;…

详解 http 鉴权

详解 http 鉴权 【总结分享】10种常用前后端鉴权方法&#xff0c;让你不再迷惘 &#x1f31f;&#x1f31f;&#x1f31f; 前端开发登录鉴权方案完全梳理 &#x1f31f;&#x1f31f;&#x1f31f; 实践出真知&#xff0c;聊聊 HTTP 鉴权那些事 注&#xff1a;此处主要讲的是…

文件服务器鉴权,服务鉴权

使用kmse实现服务的权限校验 通过一个简单的实例说明开发者如何通过kmse进行服务间的权限校验。 一、准备客户端和服务端两个demo 这里演示如何快速实践服务鉴权功能。假如现在有两个微服务 auth-client 和 auth-server&#xff0c;想实现 auth-client 调用 auth-server 时&…

前后端常见的几种鉴权方式

最近在重构公司以前产品的前端代码,摈弃了以前的session-cookie鉴权方式,采用token鉴权,忙里偷闲觉得有必要对几种常见的鉴权方式整理一下。 目前我们常用的鉴权有四种: HTTP Basic Authenticationsession-cookieToken 验证OAuth(开放授权)一.HTTP Basic Authentication 这…

鉴权的4种基本方法

一、基于服务器常出现的问题 Seesions&#xff1a; 每次认证用户发起请求时&#xff0c;服务器需要去创建一个记录来存储信息。当越来越多的用户发请求时&#xff0c;内存的开销也会不断增加。 可扩展性&#xff1a; 由于sessions存放在服务器内存中&#xff0c;伴随而来的是可…

什么是鉴权?一篇文章带你了解postman的多种方式

目录 一、什么是鉴权&#xff1f; 二、postman鉴权方式 一、什么是鉴权&#xff1f; 鉴权也就是身份认证&#xff0c;就是验证您是否有权限从服务器访问或操作相关数据。发送请求时&#xff0c;通常必须包含相应的检验参数以确保请求具有访问权限并返回所需数据。通俗的讲就…

10 分钟带你了解鉴权那些事

前言&#xff1a; 鉴权是自动化测试路上的拦路虎&#xff0c;相信大部分同学都深有体会&#xff0c;今天我们就讲一讲这个鉴权到底是怎么回事。 一、什么是鉴权&#xff0c;为什么要鉴权 鉴权&#xff1a;是指是指验证用户是否拥有访问系统的权利。为什么要鉴权&#xff1a;…

常见的鉴权方式简述

一、什么是鉴权&#xff0c;为什么要鉴权 鉴权&#xff1a;是指验证用户是否有访问系统的权利。 为什么要鉴权 &#xff1a;对用户进行鉴权&#xff0c;防止非法用户占用网络资源&#xff0c;非法用户接入网络&#xff0c;被骗取关键信息 二、鉴权方式 Basic Auth basic au…

笔记——什么是鉴权

前言 鉴权是自动化测试路上的拦路虎&#xff1b;故以此记录鉴权到底是怎么回事。 一、什么是鉴权&#xff0c;为什么要鉴权 鉴权&#xff1a;是指验证用户是否有访问系统的权利。为什么要鉴权 &#xff1a;对用户进行鉴权&#xff0c;防止非法用户占用网络资源&#xff0c;非…

ftok()函数解析

ftok 消息队列、信号灯、共享内存常用在Linux服务端编程的进程间通信环境中。而此三类编程函数在实际项目中都是用System V IPC函数实现的。System V IPC函数名称和说明如下表15-1所示。 表15-1 System V IPC函数 消息队列 信号灯 共享内存区 头文件 <sys/msg.h> …

ftok()函数的使用

在上一篇文章中&#xff0c;Mayuyu讲述了共享内存的原理以及使用方法。在创建共享内存之前&#xff0c;必须指定一个ID值&#xff0c;而这个ID值通常是通过现在要讲的ftok()函数得到。ftok()函数原型如下 其中参数fname是指定的文件名&#xff0c;这个文件必须是存在的而且可以…

linux ftok函数的使用

ftok API #include <sys/types.h> #include <sys/ipc.h> key_t ftok(const char *pathname, int proj_id); ftok根据路径名&#xff0c;提取文件信息&#xff0c;再根据这些文件信息及project ID合成key&#xff0c;该路径可以随便设置。该路径是必须存在的&#x…

ftok与fork

ftok函数编辑 系统建立IPC通讯 &#xff08; 消息队列、 信号量和 共享内存&#xff09; 时必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 2ftok原型编辑 头文件 #include < sys/types.h> #include <sys/ipc.h> 函数原型&#xff1a; key_t f…

Linux下的ftok()函数

linux ftok&#xff08;&#xff09;函数 - 清清飞扬 - 博客园 (cnblogs.com) 系统建立IPC通讯&#xff08;如消息队列、共享内存时&#xff09;必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 ftok原型如下&#xff1a; key_t ftok( char * fname, int i…

Linux中ftok函数介绍

函数原型&#xff1a; *key_t ftok(const char fname, int id); 功能&#xff1a;系统建立IPC通讯&#xff08;如消息队列&#xff0c;共享内存时&#xff09;必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到 返回值&#xff1a;成功返回一个key_t值&#xf…

linux ftok()

系统建立IPC通讯&#xff08;如消息队列、共享内存时&#xff09;必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 ftok原型如下&#xff1a; C代码 key_t ftok( char * fname, int id) key_t ftok( char * fname, int id) fname就时你指定的文件名&a…

Linux中ftok函数详解

在ipc通信中 system V 模式的ipc通信中都需要一个key值来生成对应的ID&#xff0c;那么key是如何生成的呢&#xff1f; 通过函数ftok生成 #include <sys/types.h>#include <sys/ipc.h>key_t ftok(const char *pathname, int proj_id);参数&#xff1a; pathname: …

ftok说明

文章一&#xff1a; ftok函数 系统建立IPC通讯&#xff08;消息队列、信号量和共享内存&#xff09;时必须指定一个ID值。通常情况下&#xff0c;该id值通过ftok函数得到。 ftok原型 头文件&#xff1a; #include <sys/types.h> #include <sys/ipc.h> 如下&…

ftok()函数深度解析

关于ftok函数&#xff0c;先不去了解它的作用来先说说为什么要用它&#xff0c;共享内存&#xff0c;消息队列&#xff0c;信号量它们三个都是找一个中间介质&#xff0c;来进行通信的&#xff0c;这种介质多的是。就是怎么区分出来&#xff0c;就像唯一一个身份证来区分人一样…

linux进程间通信--消息队列相关函数(ftok)详解

ftok 消息队列、信号灯、共享内存常用在Linux服务端编程的进程间通信环境中。而此三类编程函数在实际项目中都是用System V IPC函数实现的。System V IPC函数名称和说明如下表15-1所示。 表15-1 System V IPC函数 消息队列 信号灯 共享内存区 头文件 <sys/msg.h> &l…