鉴权与授权
maven坐标
<dependency>
<groupId>com.ikingtech.framework</groupId>
<artifactId>sdk-security</artifactId>
</dependency>
鉴权
单体架构
在单体架构的场景下,由鉴权模块直接进行鉴权,具体流程如下:
微服务架构
在微服务架构的场景下,理论上所有请求都应经过网关服务的转发,因此鉴权处理集中在网关服务内进行,具体流程如下:
鉴权逻辑
鉴权模块或网关服务通过Spring提供的过滤器Filter
对每一次请求进行拦截,并从请求头中获取当前请求所携带的Token
。
- 若当前请求未携带
Token
,且当前请求地址不属于白名单,直接返回失败,提示非法请求。 - 若当前请求携带了
Token
,但缓存中没有Token
信息,直接返回失败,提示登录过期。此时客户端需重新登录并携带新的Token
发起请求。 - 若当前请求携带了
Token
,且缓存中存在Token
的信息,则通过Token
从缓存中获取用户身份信息。获取到用户信息后,检查是否存在扩展请求头数据,若存则将扩展数据也保存到用户身份信息中。最后将用户身份信息放入当前请求的ThreadLocal
中,并放行当前请求。 - 平台从查询参数
token
或请求头Authorization
/Token
/X-Access-Token
中获取Token
。
平台将鉴权逻辑封装为组件,如有需要可单独引用。
<dependency>
<groupId>com.ikingtech.framework</groupId>
<artifactId>sdk-authenticate-extension</artifactId>
</dependency>
使用方式如下:
- 注入
IdentityValidator
。 - 调用
validate
方法进行鉴权,如果鉴权成功返回用户身份信息Identity
,如果鉴权失败则返回null
。
白名单配置
- 平台支持配置白名单,可放行指定接口,但需要注意的是,放行的接口由于未经过鉴权,因此服务端获取到的用户信息为未知用户。
- 接口请求路径支持模糊匹配。
单体架构
iking:
framework:
security:
ignore:
- /foo
- /bar
- /foo/**/bar
微服务架构
iking:
framework:
gateway:
ignore:
- /foo
- /bar
- /foo/**/bar
用户身份信息
设置用户身份信息
在一般的业务系统中,经常需要获取当前登录用户的信息,例如当前用户的编号、头像、角色及权限等。平台借助ThreadLocal
来存放当前请求的用户身份信息。
获取用户身份信息
如需获取当前请求的用户身份信息,请确保已经依赖了以下组件:
<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
对象中,以供业务使用。这样,每次请求都可以轻松地获取并应用用户的数据权限,确保提供符合权限限制的数据和功能。这种机制有助于提高系统的安全性和效率。
用户登录成功后,平台会自动向授权服务发送请求,并根据用户所拥有的角色信息获取该用户的所有权限。这些权限将被存储起来以供后续使用。在后续的请求中,前端会携带每个菜单的menuId
。通过拦截器的处理,用户的权限信息将被加载到Me
对象中。这样,在用户进行各自业务逻辑操作时,当需要获取当前用户在当前页面的数据权限时,只需调用Me.dataScope()
方法即可。该方法会直接返回当前用户对应单位的代码集合,以满足业务逻辑中对数据权限的要求。
- 场景1:当用户点击某个菜单时,页面初始化加载。在该过程中,可以调用
Me.dataScope()
方法,以获取当前用户权限下的所有单位代码集合。这样,页面就能根据用户的权限限制,展示相应单位的数据。 - 场景2:当用户选择了筛选条件,例如指定了一个特定的单位进行查询操作。此时,可以调用
Me.dataScope(部门code)
方法,以获取当前用户权限下指定单位及其所有子单位的代码集合。通过这种方式,可以确保用户只能访问其具有权限的单位及其子单位的数据,实现了数据权限的精确控制。
如需获取用户授权能力,请确保依赖了以下组件:
<dependency>
<groupId>com.ikingtech.platform</groupId>
<artifactId>service-authorization</artifactId>
</dependency>
通用Token
在对后端接口进行调测时,每次调用前都需要登录并复制Token到请求头中,这样做很浪费时间,影响效率。平台提供了通用Token,可以在调测时指定通用Token,省去登录的步骤。
使用了通用Token后,用户身份默认为管理员用户。
默认Token:Bearer iking