当前位置: 首页 > news >正文

企业建设企业网站的好处广州小程序开发报价

企业建设企业网站的好处,广州小程序开发报价,兴义网络推广,福州注册公司流程及费用说明#xff1a;基于角色的权限验证#xff08;Role-Based Access Control#xff0c;RBAC#xff09;框架#xff0c;是目前大多数服务端的登录校验框架。本文介绍如何快速搭建一个这样的框架#xff0c;不用Shiro、Spring Security、Sa-Token这样的“大框架”实现。 R…说明基于角色的权限验证Role-Based Access ControlRBAC框架是目前大多数服务端的登录校验框架。本文介绍如何快速搭建一个这样的框架不用Shiro、Spring Security、Sa-Token这样的“大框架”实现。 RBAC 基于角色的权限验证包含了三个实体用户、角色、权限三种关系如下 一个用户可以有多个角色一个角色有多个权限例如某用户张三拥有超级管理员权限、普通用户这两个角色而其中超级管理员具有删除用户、创建用户权限。 综上分析三个实体两个多对多关系一般来说我们需要以下五张表 用户表 角色表 权限表 用户角色表 角色权限表 前三张表是一定要有的后面两张关系表可以放到前面表里面作为一个字段存进去但不建议难以维护查询也不方便。 搭建 分析完了开始搭建这样一个框架。前面说了这里不用Shiro、Spring Security、Sa-Token这里介绍一个GitHub项目 SpringBoot-Shiro-Vue 最初这位大佬应该是想做一个Shiro的Demo做到最后发现没有Shiro也能实现基于角色的权限验证就把Shiro依赖去掉了。我是无意中找到的发现还不错如果想搭建一个这样的权限验证框架这个就可以了。简单的就是好的。 首先把项目Clone下来打开如下 介绍 接着来介绍这个项目是如何实现RBAC的RBAC要解决的是下面几个问题 当前用户的权限如何存储 如何实现当前用户对接口级别的权限校验 权限校验怎么实现 …… 这是我能想到的几个问题分析一下 第一个问题是怎么存储用户的权限信息可以存在数据库里每次请求访问接口时去查数据库拿到这个用户的所有权限但是这样效率低访问数据库过于频繁可以考虑存入到ThreadLocal、Caffine等本地缓存里能存到Redis里吗可以思考一下 第二个问题是如何实现权限校验可以像Spring Security那样使用拦截器在访问接口前先拦截下来然后获取当前用户的所有接口权限拿到可访问的接口列表然后加以判断看当前要访问的接口地址是否在这里面不在就返回没有权限 第三个问题是权限校验怎么实现像我前面说的那样把用户可访问的所有接口地址拿出来然后校验也是一种方法但最好的方法是用AOP自定义注解在Controller层的各个接口上打上注解限定这个接口隶属哪个角色的哪个权限然后在AOP里面去拿到当前用户的权限列表看是否有这个权限。 我们来看下这个项目是怎么做的。 登录 登录校验用户名、密码返回Token的同时将当前用户信息包括角色、权限存入到Caffeine中 Controller /*** 登录*/PostMapping(/auth)public JSONObject authLogin(RequestBody JSONObject requestJson) {CommonUtil.hasAllRequired(requestJson, username,password);return loginService.authLogin(requestJson);}Service /*** 登录表单提交*/public JSONObject authLogin(JSONObject jsonObject) {String username jsonObject.getString(username);String password jsonObject.getString(password);JSONObject info new JSONObject();JSONObject user loginDao.checkUser(username, password);if (user null) {throw new CommonJsonException(ErrorEnum.E_10010);}String token tokenService.generateToken(username);info.put(token, token);return CommonUtil.successJson(info);}校验SQL就是单纯的根据用户名、密码查询看是否有这条记录非常简易这个正式环境需要改造一下 select idcheckUser resultTypecom.alibaba.fastjson.JSONObjectSELECT u.id userIdFROM sys_user uWHERE u.username #{username}AND u.password #{password}AND u.delete_status 1/select发Token同时将当前用户信息存入到本地缓存里key是当前用户的Token /*** 用户登录验证通过后(sso/帐密),生成token,记录用户已登录的状态*/public String generateToken(String username) {MDC.put(username, username);String token UUID.randomUUID().toString().replace(-, ).substring(0, 20);//设置用户信息缓存setCache(token, username);return token;}setCache()方法查找当前用户信息存入本地缓存 AutowiredCacheString, SessionUserInfo cacheMap;/*** 将用户的信息以 tokenSessionUser存入到本地缓存中* param token* param username*/private void setCache(String token, String username) {SessionUserInfo info getUserInfoByUsername(username);log.info(设置用户信息缓存:token{} , username{}, info{}, token, username, info);cacheMap.put(token, info);}getUserInfoByUsername()方法根据用户名查找用户信息 /*** 根据用户名查询用户信息包括角色、权限列表* param username* return*/private SessionUserInfo getUserInfoByUsername(String username) {SessionUserInfo userInfo loginDao.getUserInfo(username);if (userInfo.getRoleIds().contains(1)) {//管理员,查出全部按钮和权限码userInfo.setMenuList(loginDao.getAllMenu());userInfo.setPermissionList(loginDao.getAllPermissionCode());}return userInfo;}getUserInfo()方法查找当前用户信息的SQL可以看到关联到了前面提到的五张表 select idgetUserInfo resultMapuserInfoSELECT u.id userId,u.username,u.nickname,ur.role_id roleId,p.menu_code menuCode,p.permission_code permissionCodeFROM sys_user uLEFT JOIN sys_user_role ur on u.id ur.user_idLEFT JOIN sys_role r ON r.id ur.role_idLEFT JOIN sys_role_permission rp ON r.id rp.role_idLEFT JOIN sys_permission p ON rp.permission_id p.id AND rp.delete_status 1WHERE u.username #{username}AND u.delete_status 1/select校验 在看下校验是如何实现的除了登录、登出等几个接口没有权限其他用户操作、业务操作的接口上都加了自定义注解如下 package com.heeexy.example.controller;import com.alibaba.fastjson.JSONObject; import com.heeexy.example.config.annotation.Logical; import com.heeexy.example.config.annotation.RequiresPermissions; import com.heeexy.example.service.UserService; import com.heeexy.example.util.CommonUtil; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;/*** author: heeexy* description: 用户/角色/权限相关controller* date: 2017/11/2 10:19*/ RestController RequestMapping(/user) public class UserController {Autowiredprivate UserService userService;/*** 查询用户列表*/RequiresPermissions(user:list)GetMapping(/list)public JSONObject listUser(HttpServletRequest request) {return userService.listUser(CommonUtil.request2Json(request));}RequiresPermissions(user:add)PostMapping(/addUser)public JSONObject addUser(RequestBody JSONObject requestJson) {CommonUtil.hasAllRequired(requestJson, username, password, nickname, roleIds);return userService.addUser(requestJson);}RequiresPermissions(user:update)PostMapping(/updateUser)public JSONObject updateUser(RequestBody JSONObject requestJson) {CommonUtil.hasAllRequired(requestJson, nickname, roleIds, deleteStatus, userId);return userService.updateUser(requestJson);}RequiresPermissions(value {user:add, user:update}, logical Logical.OR)GetMapping(/getAllRoles)public JSONObject getAllRoles() {return userService.getAllRoles();}/*** 角色列表*/RequiresPermissions(role:list)GetMapping(/listRole)public JSONObject listRole() {return userService.listRole();}/*** 查询所有权限, 给角色分配权限时调用*/RequiresPermissions(role:list)GetMapping(/listAllPermission)public JSONObject listAllPermission() {return userService.listAllPermission();}/*** 新增角色*/RequiresPermissions(role:add)PostMapping(/addRole)public JSONObject addRole(RequestBody JSONObject requestJson) {CommonUtil.hasAllRequired(requestJson, roleName,permissions);return userService.addRole(requestJson);}/*** 修改角色*/RequiresPermissions(role:update)PostMapping(/updateRole)public JSONObject updateRole(RequestBody JSONObject requestJson) {CommonUtil.hasAllRequired(requestJson, roleId,roleName,permissions);return userService.updateRole(requestJson);}/*** 删除角色*/RequiresPermissions(role:delete)PostMapping(/deleteRole)public JSONObject deleteRole(RequestBody JSONObject requestJson) {CommonUtil.hasAllRequired(requestJson, roleId);return userService.deleteRole(requestJson);} }如查看用户列表接口上加的注解如下 RequiresPermissions(value {user:add, user:update}, logical Logical.OR)表示的是访问此接口需要拥有添加用户或者更新用户权限后面的logical Logical.OR也是自定义的 然后看AOP里面是怎么实现的这是RBAC的精华如下 package com.heeexy.example.config.filter;import com.heeexy.example.config.annotation.Logical; import com.heeexy.example.config.annotation.RequiresPermissions; import com.heeexy.example.config.exception.UnauthorizedException; import com.heeexy.example.dto.session.SessionUserInfo; import com.heeexy.example.service.TokenService; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; import org.aspectj.lang.reflect.MethodSignature; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component;import java.util.Arrays; import java.util.Set;/*** author heeexy* description: [角色权限]控制拦截器*/ Aspect Slf4j Component Order(3) public class PermissionAspect {AutowiredTokenService tokenService;Before(annotation(com.heeexy.example.config.annotation.RequiresPermissions))public void before(JoinPoint joinPoint) {log.debug(开始校验[操作权限]);SessionUserInfo userInfo tokenService.getUserInfo();SetString myCodes userInfo.getPermissionList();Signature signature joinPoint.getSignature();MethodSignature methodSignature (MethodSignature) signature;RequiresPermissions a methodSignature.getMethod().getAnnotation(RequiresPermissions.class);String[] perms a.value();log.debug(校验权限code: {}, Arrays.toString(perms));log.debug(用户已有权限: {}, myCodes);//5.对比[要求]的code和[用户实际拥有]的codeif (a.logical() Logical.AND) {//必须包含要求的每个权限for (String perm : perms) {if (!myCodes.contains(perm)) {log.warn(用户缺少权限 code : {}, perm);throw new UnauthorizedException();//抛出[权限不足]的异常}}} else {//多个权限只需包含其中一种即可boolean flag false;for (String perm : perms) {if (myCodes.contains(perm)) {flag true;break;}}if (!flag) {log.warn(用户缺少权限 code : {} (任意有一种即可), Arrays.toString(perms));throw new UnauthorizedException();//抛出[权限不足]的异常}}} }这里的实现也很容易理解先从本地缓存中取出当前用户的权限列表然后再取出接口上面的权限列表和逻辑运算符AND还是OR加以判断看当前用户是否包含了这个接口所需要的权限。 以上就是这个项目对RBAC的实现没有用到第三方权限验证框架短小精悍很有启发。如果你需要搭建这样一个登录框架可以看看这个项目删删减减就可以拿来用了。另外作者还提供了配套的前端Vue项目也可以部署看看。 总结 本文介绍了Github作者Heeexy的SpringBoot-Shiro-Vue项目可以快速搭建一个基于角色的权限验证框架。
http://www.w-s-a.com/news/89915/

相关文章:

  • wordpress站点更换域名自己做wordpress 模版
  • 怎么做虚拟的网站东莞常平邮编是多少
  • 电子商务网站和普通网站的区别正规网站建设多少费用
  • 郴州免费招聘网站前端好还是后端好
  • 织梦网站怎样做子域名20个中国风网站设计欣赏
  • wordpress网站搬简约创意logo图片大全
  • 叙述网站制作的流程石家庄58同城最新招聘信息
  • 南昌微信网站建设东莞网站优化软件
  • 爱站数据官网纯静态网站挂马
  • 网站建设公司未来方向3d设计网站
  • 建设部网站 干部学院 一级注册建筑师培训 2014年做网站开发的提成多少钱
  • 网上请人做软件的网站铝合金型材外发加工网
  • 手机网站建设万网山东省作风建设网站
  • 网站策划专员招聘50万县城做地方网站
  • 网站开发公司+重庆wordpress自定义搜索界面
  • 梅州南站学校官网
  • 网站变灰代码 所有浏览器企业邮箱域名怎么填写
  • 网站建设哪好旅行社网站模板
  • 网站开发发展存在的问题交换链接营销的经典案例
  • 烟台高端网站建设公司福田市网站建设推广
  • 做网站如何保证询盘数量智慧城市
  • 大连网站平台研发wordpress更改地址
  • 做标书要不要做网站南昌网站排名优化费用
  • 网站内容如何自动关联新浪微博万网域名信息
  • 网站出售网络推广服务费计入什么科目
  • 宁波咨询网站设计西安网站制作开发
  • 深圳市专注网站建设全网营销网络推广
  • 如何快速建设网站虚拟空间软件
  • 一个虚拟主机可以做几个网站免费软件下载中心
  • 美工培训网站中国建筑网官网手机版