Skip to content

鉴权与授权

maven坐标

xml
<dependency>
    <groupId>com.ikingtech.framework</groupId>
    <artifactId>sdk-security</artifactId>
</dependency>

鉴权


单体架构

在单体架构的场景下,由鉴权模块直接进行鉴权,具体流程如下:
微信小程序登录流程 (4).png

微服务架构

在微服务架构的场景下,理论上所有请求都应经过网关服务的转发,因此鉴权处理集中在网关服务内进行,具体流程如下:
微信小程序登录流程 (6).png

鉴权逻辑

鉴权模块或网关服务通过Spring提供的过滤器Filter对每一次请求进行拦截,并从请求头中获取当前请求所携带的Token

  • 若当前请求未携带Token,且当前请求地址不属于白名单,直接返回失败,提示非法请求。
  • 若当前请求携带了Token,但缓存中没有Token信息,直接返回失败,提示登录过期。此时客户端需重新登录并携带新的Token发起请求。
  • 若当前请求携带了Token,且缓存中存在Token的信息,则通过Token从缓存中获取用户身份信息。获取到用户信息后,检查是否存在扩展请求头数据,若存则将扩展数据也保存到用户身份信息中。最后将用户身份信息放入当前请求的ThreadLocal中,并放行当前请求。
  • 平台从查询参数token或请求头Authorization/Token/X-Access-Token中获取Token

平台将鉴权逻辑封装为组件,如有需要可单独引用。

xml
<dependency>
    <groupId>com.ikingtech.framework</groupId>
    <artifactId>sdk-authenticate-extension</artifactId>
</dependency>

使用方式如下:

  1. 注入IdentityValidator
  2. 调用validate方法进行鉴权,如果鉴权成功返回用户身份信息Identity,如果鉴权失败则返回null

白名单配置

  • 平台支持配置白名单,可放行指定接口,但需要注意的是,放行的接口由于未经过鉴权,因此服务端获取到的用户信息为未知用户
  • 接口请求路径支持模糊匹配。

单体架构

yaml
iking:
  framework:
    security:
      ignore:
        - /foo
        - /bar
        - /foo/**/bar

微服务架构

yaml
iking:
  framework:
    gateway:
      ignore:
        - /foo
        - /bar
        - /foo/**/bar

用户身份信息


设置用户身份信息

在一般的业务系统中,经常需要获取当前登录用户的信息,例如当前用户的编号、头像、角色及权限等。平台借助ThreadLocal来存放当前请求的用户身份信息。
微信小程序登录流程 (1).png

获取用户身份信息

如需获取当前请求的用户身份信息,请确保已经依赖了以下组件:

xml
<dependency>
    <groupId>com.ikingtech.framework</groupId>
    <artifactId>sdk-context</artifactId>
</dependency>

可获取的用户身份信息包括:

信息获取方式返回值类型
用户编号Me.id()String
用户账户名Me.username()String
用户姓名Me.name()String
用户当前租户Me.tenantCode()String
用户当前国际化配置
支持简体中文(zh-CN)和英文(en-US)
Me.lang()String
完整身份信息Me.info()Identity对象
用户数据权限Me.dataScope()List<String>
用户数据权限是否合法Me.invalidDataScope()Boolean
是否管理员用户Me.isAdmin()Boolean
业务方扩展信息Me.info().getExtensions()Map

授权

在实际业务中,服务端需要了解当前用户的数据权限,以便在处理业务逻辑时提供准确的信息。为此,在这种情况下,授权服务在用户第一次登录时将权限信息存储到缓存中,并在后续的请求中将权限信息添加到 Me 对象中,以供业务使用。这样,每次请求都可以轻松地获取并应用用户的数据权限,确保提供符合权限限制的数据和功能。这种机制有助于提高系统的安全性和效率。
微信小程序登录流程 (7).png
用户登录成功后,平台会自动向授权服务发送请求,并根据用户所拥有的角色信息获取该用户的所有权限。这些权限将被存储起来以供后续使用。在后续的请求中,前端会携带每个菜单的menuId。通过拦截器的处理,用户的权限信息将被加载到Me对象中。这样,在用户进行各自业务逻辑操作时,当需要获取当前用户在当前页面的数据权限时,只需调用Me.dataScope()方法即可。该方法会直接返回当前用户对应单位的代码集合,以满足业务逻辑中对数据权限的要求。

  • 场景1:当用户点击某个菜单时,页面初始化加载。在该过程中,可以调用Me.dataScope()方法,以获取当前用户权限下的所有单位代码集合。这样,页面就能根据用户的权限限制,展示相应单位的数据。
  • 场景2:当用户选择了筛选条件,例如指定了一个特定的单位进行查询操作。此时,可以调用Me.dataScope(部门code)方法,以获取当前用户权限下指定单位及其所有子单位的代码集合。通过这种方式,可以确保用户只能访问其具有权限的单位及其子单位的数据,实现了数据权限的精确控制。

如需获取用户授权能力,请确保依赖了以下组件:

xml
<dependency>
    <groupId>com.ikingtech.platform</groupId>
    <artifactId>service-authorization</artifactId>
</dependency>

通用Token

在对后端接口进行调测时,每次调用前都需要登录并复制Token到请求头中,这样做很浪费时间,影响效率。平台提供了通用Token,可以在调测时指定通用Token,省去登录的步骤。

使用了通用Token后,用户身份默认为管理员用户。

默认Token:Bearer iking