闵行营销型网站建设,邢台建站,电子商务网站建设总结与体会,网站建设的外文参考文献前言#xff1a;RuoYi框架中#xff0c;菜单管理的权限标识字段通常用于定义用户对特定菜单或操作的访问权限。 这个权限标识字段通常会被用在两个地方#xff1a; 1. 后端#xff1a;在Spring Security的PreAuthorize注解中#xff0c;用于控制对特定方法的访问。例如RuoYi框架中菜单管理的权限标识字段通常用于定义用户对特定菜单或操作的访问权限。 这个权限标识字段通常会被用在两个地方 1. 后端在Spring Security的PreAuthorize注解中用于控制对特定方法的访问。例如PreAuthorize(hasAuthority(monitor:job:add))会在执行方法前检查用户是否具有monitor:job:add这个权限。 2. 前端在Vue.js的v-hasPermi指令中用于控制基于权限的UI元素的显示和隐藏。例如v-hasPermi[monitor:job:add]会检查用户是否具有monitor:job:add这个权限如果有那么相关的UI元素就会显示。 通过这种方式RuoYi框架可以实现精细的基于权限的访问控制确保只有具有相应权限的用户才能访问特定的资源。
详细整理如下 当用户登录系统的时候会调用getInfo接口在该接口中会将用户、权限、角色等集合信息返回给前端。 获取用户信息
从request请求中获取token进而获取用户信息
LoginUser loginUser tokenService.getLoginUser(ServletUtils.getRequest());
获取角色集合
根据userId获取当前用户角色集合
SetString roles roleService.selectRolePermissionByUserId(user.getUserId()); 核心的sql语句 匹配出当前用户拥有哪些角色 select distinct r.role_id, r.role_name, r.role_key, r.role_sort, r.data_scope,r.status, r.del_flag, r.create_time, r.remark from sys_role rleft join sys_user_role ur on ur.role_id r.role_idleft join sys_user u on u.user_id ur.user_idleft join sys_dept d on u.dept_id d.dept_idWHERE r.del_flag 0 and ur.user_id #{userId} 获取权限集合 通过user对象获取当前用户的权限集合
SetString permissions permissionService.getMenuPermission(user); 核心sql语句 通过userId获取当前用户所有角色的所有权限
select distinct m.permsfrom sys_menu mleft join sys_role_menu rm on m.menu_id rm.menu_idleft join sys_user_role ur on rm.role_id ur.role_idleft join sys_role r on r.role_id ur.role_idwhere m.status 0 and r.status 0 and ur.user_id #{userId}
PreAuthorize注解工作流程
用户此时已经登陆系统假设用户操作的是角色管理模块的查询按钮当点击该按钮时会通过网络映射到后端的接口方法。
当这个请求到达被PreAuthorize注解的方法时Spring Security的拦截器会拦截这个请求。
拦截器会获取到PreAuthorize注解中的表达式并使用Spring EL表达式语言对其进行求值。这个过程通常会涉及到当前用户的认证信息例如用户的角色、权限等。根据表达式的求值结果Spring Security会做出访问控制决策。如果表达式求值为true那么请求会被允许继续执行如果表达式求值为false那么请求会被拒绝通常会返回一个HTTP 403 Forbidden错误。
PreAuthorize(ss.hasPermi(system:role:list))GetMapping(/list)public TableDataInfo list(SysRole role){startPage();ListSysRole list roleService.selectRoleList(role);return getDataTable(list);} /*** 验证用户是否具备某权限* * param permission 权限字符串* return 用户是否具备某权限*/public boolean hasPermi(String permission){if (StringUtils.isEmpty(permission)){return false;}LoginUser loginUser tokenService.getLoginUser(ServletUtils.getRequest());if (StringUtils.isNull(loginUser) || CollectionUtils.isEmpty(loginUser.getPermissions())){return false;}return hasPermissions(loginUser.getPermissions(), permission);}
如果当前用户的权限集合中包含当前被PreAuthorize标注的方法的权限则返回true。 /*** 判断是否包含权限* * param permissions 权限列表* param permission 权限字符串* return 用户是否具备某权限*/private boolean hasPermissions(SetString permissions, String permission){return permissions.contains(ALL_PERMISSION) || permissions.contains(StringUtils.trim(permission));}
如果请求被允许继续执行那么被PreAuthorize注解的方法会被调用。