018-从零搭建微服务-系统服务(五)

这篇具有很好参考价值的文章主要介绍了018-从零搭建微服务-系统服务(五)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

写在最前

如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。

源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning

源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui

文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis

前情回顾

之前我们设计了权限模型并提交了数据库脚本,然后通过 mingyue-common-gen 模块 MingYueCommonGenDemo 生成了基础代码,接下来我们需要提供两个关键接口:

  1. 获取用户权限信息;
  2. 获取用户路由信息;

TIPS

为了严格按照 RESTful 接口风格设计,变更现有接口命名: getSysUserInfoByUsername => userInfogetSysUsers => list,后续接口也将严格按照 RESTful 接口风格设计。

登录缓存用户信息

Session 会话

Session 是会话中专业的数据缓存组件,通过 Session 我们可以很方便的缓存一些高频读写数据,提高程序性能,例如:

// 在登录时缓存 user 对象 
StpUtil.getSession().set("user", user);

// 然后我们就可以在任意处使用这个 user 对象
SysUser user = (SysUser) StpUtil.getSession().get("user");

在 Sa-Token 中,Session 分为三种,分别是:

  • Account-Session: 指的是框架为每个账号 id 分配的 Session
  • Token-Session: 指的是框架为每个 token 分配的 Session
  • Custom-Session: 指的是以一个特定的值作为 SessionId,来分配的 Session

Token-Session

缓存用户信息

public static void login(SysUser userInfo) {
  // 请求作用域:存储的数据只在一次请求内有效,请求结束后数据自动清除。
  SaStorage storage = SaHolder.getStorage();
  storage.set(LOGIN_USER_KEY, userInfo);
  storage.set(USER_KEY, userInfo.getUserId());

  // 第1步,先登录上
  StpUtil.login(userInfo.getUserId());
  // 第3步,缓存用户信息
  StpUtil.getTokenSession().set(LOGIN_USER_KEY, userInfo);
}

获取用户信息

public static SysUser getLoginUser() {
  SysUser loginUser = (SysUser) SaHolder.getStorage().get(LOGIN_USER_KEY);
  if (loginUser != null) {
    return loginUser;
  }
  
  loginUser = (SysUser) StpUtil.getTokenSession().get(LOGIN_USER_KEY);
  SaHolder.getStorage().set(LOGIN_USER_KEY, loginUser);
  return loginUser;
}

接口测试

@GetMapping("info")
@Operation(summary = "获取当前用户全部信息")
public R<SysUser> userInfo() {
  SysUser sysUser = LoginHelper.getLoginUser();
  System.out.println("=============================");
  System.out.println(JSONUtil.toJsonStr(sysUser));
  System.out.println("=============================");
  return R.ok(null);
}

接口调用打印如下:

=============================
{"userId":1,"username":"mingyue","nickname":"明月","sex":"0","password":"123456","phone":"13288888888","status":"0","isDeleted":"0","createTime":1689757582000,"updateTime":1689757585000,"createBy":"mingyue","updateBy":"mingyue"}
=============================

获取用户权限信息

接口层

@GetMapping("info")
@Operation(summary = "获取当前登录用户全部信息")
public R<UserInfoVo> userInfo() {
   return R.ok(sysUserService.getUserInfo());
}

业务层

@Override
public UserInfoVo getUserInfo() {
   UserInfoVo result = new UserInfoVo();

   SysUser sysUser = LoginHelper.getLoginUser();
   // 密码置空
   sysUser.setPassword(null);
   result.setSysUser(sysUser);

   // 设置角色列表
   Set<String> rolePermission = sysRoleService.getRolePermission(sysUser.getUserId());
   result.setRoles(rolePermission);

   // 设置权限列表
   Set<String> menuPermission = sysMenuService.getMenuPermission(sysUser.getUserId());
   result.setRoles(menuPermission);

   return result;
}

测试接口

Authorization Token 通过登录接口获取

curl -X 'GET' \
'http://mingyue-gateway:9100/system/sysUser/info' \
-H 'accept: */*' \
-H 'Authorization: vXPJnADIcTPfKuP3reBYmmUAi4xjw8nf'

接口返回

{
  "code": 200,
  "msg": "操作成功",
  "data": {
    "sysUser": {
      "userId": 1,
      "username": "mingyue",
      "nickname": "明月",
      "sex": "0",
      "password": null,
      "phone": "13288888888",
      "email": null,
      "avatar": null,
      "status": "0",
      "isDeleted": "0",
      "createTime": "2023-07-19T17:06:22",
      "updateTime": "2023-07-19T17:06:25",
      "createBy": "mingyue",
      "updateBy": "mingyue"
    },
    "permissions": null,
    "roles": [
      null,
      "system:user:list"
    ]
  }
}

获取用户路由信息

接口层

@GetMapping("getRouters")
@Operation(summary = "获取路由信息")
public R<List<RouterVo>> getRouters() {
  Long userId = LoginHelper.getLoginUser().getUserId();
  return R.ok(sysMenuService.getRouters(userId));
}

业务层

@Override
public List<RouterVo> getRouters(Long userId) {
  List<SysMenu> sysMenus = sysMenuMapper.selectMenuTreeByUserId(userId);

  return this.recursionMenu(sysMenus, -1L);
}

/**
	* 递归菜单,构建菜单树
	*/
private List<RouterVo> recursionMenu(List<SysMenu> sysMenus, Long pid) {
  List<RouterVo> tree = CollUtil.newArrayList();

  for (SysMenu menu : sysMenus) {
    if (menu.getParentId().equals(pid)) {
      RouterVo router = new RouterVo();
      router.setPath("/" + menu.getPath());
      router.setName(menu.getPath());
      router.setComponent(menu.getComponent());
      router.setRedirect(menu.getRedirect());

      MetaVo metaVo = new MetaVo();
      metaVo.setTitle(menu.getMenuName());
      metaVo.setIsLink(menu.getIsLink());
      metaVo.setIsHide(UserConstants.IS_HIDE.equals(menu.getIsHide()));
      metaVo.setIsKeepAlive(UserConstants.IS_KEEP_ALIVE.equals(menu.getIsKeepAlive()));
      metaVo.setIsAffix(UserConstants.IS_AFFIX.equals(menu.getIsAffix()));
      metaVo.setIsIframe(UserConstants.IS_IFRAME.equals(menu.getIsIframe()));
      metaVo.setIcon(menu.getIcon());
      router.setMeta(metaVo);

      router.setChildren(recursionMenu(sysMenus, menu.getMenuId()));

      tree.add(router);
    }
  }

  return tree;
}

测试接口

curl -X 'GET' \
'http://mingyue-gateway:9100/system/sysMenu/getRouters' \
-H 'accept: */*'
-H 'Authorization: vXPJnADIcTPfKuP3reBYmmUAi4xjw8nf'

接口返回

{
  "code": 200,
  "msg": "操作成功",
  "data": [
    {
      "path": "/system",
      "name": "system",
      "component": null,
      "redirect": null,
      "meta": {
        "title": "系统管理",
        "isLink": "0",
        "isHide": false,
        "isKeepAlive": false,
        "isAffix": false,
        "isIframe": false,
        "icon": "iconfont icon-xitongshezhi"
      },
      "children": [
        {
          "path": "/user",
          "name": "user",
          "component": "/system/user",
          "redirect": null,
          "meta": {
            "title": "用户管理",
            "isLink": "0",
            "isHide": false,
            "isKeepAlive": false,
            "isAffix": false,
            "isIframe": false,
            "icon": "iconfont icon-icon-"
          },
          "children": []
        },
        ...
      ]
    }
  ]
}

小结

现在用户已经拿到权限点了,接下来整合一下权限点与 Sa-Token 的使用,看看 Sa-Token 如何通过权限点控制接口访问。文章来源地址https://www.toymoban.com/news/detail-622133.html

到了这里,关于018-从零搭建微服务-系统服务(五)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 017-从零搭建微服务-系统服务(四)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 设计思路:通过用户关

    2024年02月16日
    浏览(37)
  • 从零开始:如何使用Docker构建微服务架构

    使用 Docker 构建微服务架构是一种流行的方法,因为 Docker 提供了轻量级的容器化技术,使得每个微服务可以在隔离的环境中独立运行。从零开始构建这样的架构涉及到多个步骤,包括理解微服务架构的基本概念、安装 Docker、创建 Docker 容器和镜像、配置网络,以及部署和管理

    2024年04月14日
    浏览(58)
  • 深入探索JavaEE单体架构、微服务架构与云原生架构

    链接: https://pan.baidu.com/s/1xSI1ofwYXfqOchfwszCZnA?pwd=4s99 提取码: 4s99 复制这段内容后打开百度网盘手机App,操作更方便哦 --来自百度网盘超级会员v4的分享 🔍【00】模块零:开营直播:精彩直播课程带你全面了解最新技术动态,为学习之旅打下良好基础!🎥💻 🏠【01】模块一:

    2024年02月12日
    浏览(44)
  • 浅析云原生时代的服务架构演进

    摘要: 相比于传统的微服务架构,云原生和 serverless 技术更加灵活、高效,能够更好地满足用户的需求。 本文分享自华为云社区《《凤凰架构》学习和思考——云原生时代的服务架构演进史》,作者:breakDawn。 随着云原生的概念越来越火,服务的架构应该如何发展和演进,

    2023年04月10日
    浏览(76)
  • 微服务架构2.0--云原生时代

    云原生(Cloud Native)是一种关注于在云环境中构建、部署和管理应用程序的方法和理念。云原生应用能够最大程度地利用 云计算基础设施的优势,如弹性、自动化、可伸缩性和高可用性 。这个概念涵盖了许多方面,包括 架构、开发、部署、运维 和团队文化等 容器化: 将应

    2024年02月11日
    浏览(37)
  • 023-从零搭建微服务-推送服务(三)

    原【短信服务】更名【推送服务】 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springc

    2024年02月10日
    浏览(32)
  • 027-从零搭建微服务-搜索服务(一)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis Docker 安装 ELK 7.17.2 h

    2024年02月07日
    浏览(35)
  • 028-从零搭建微服务-搜索服务(二)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 更多用法可以参考 E

    2024年02月07日
    浏览(31)
  • 022-从零搭建微服务-短信服务(二)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 需要注册一个阿里云账

    2024年02月11日
    浏览(33)
  • 021-从零搭建微服务-短信服务(一)

    如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):https://gitee.com/csps/mingyue-springcloud-learning 源码地址(前端):https://gitee.com/csps/mingyue-springcloud-ui 文档地址:https://gitee.com/csps/mingyue-springcloud-learning/wikis 短信服务(Short Messa

    2024年02月11日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包