tmerclub-doc/基本开发文档/授权校验流程.md
2025-03-19 15:04:57 +08:00

3.1 KiB
Raw Blame History

授权校验流程

为了确保系统的安全与获取用户信息一般情况下都是用token解决的那么我们的系统token是如何生成又是如何校验的呢

token的生成

com.mall4j.cloud.auth.manager.TokenStore 有几个方法

public class TokenStore {
	/**
	 * 将用户的部分信息存储在token中并返回token信息
	 * @param userInfoInToken 用户在token中的信息
	 * @return token信息
	 */
    public TokenInfoBO storeAccessToken(UserInfoInTokenBO userInfoInToken) {}
    /**
	 * 根据accessToken 获取用户信息
	 * @param accessToken accessToken
	 * @param needDecrypt 是否需要解密
	 * @return 用户信息
	 */
	public ServerResponseEntity<UserInfoInTokenBO> getUserInfoByAccessToken(String accessToken, boolean needDecrypt) {}
    
	/**
	 * 刷新token并返回新的token
	 * @param refreshToken
	 * @return
	 */
	public ServerResponseEntity<TokenInfoBO> refreshToken(String refreshToken) {}
}

com.mall4j.cloud.auth.controller.LoginController#login() 方法中,登录完毕之后使用storeAccessToken将登录的用户信息保存在redis中

token的校验

在我们的设计当中会一个授权中心专门用于用户的授权登录并校验token。从而不需要在每个服务都去创建自身的授权方法。

我们用商品的服务mall4cloud-product来举例,我们可以发现在pom.xml中依赖了mall4cloud-common-security模块。

在模块中有个过滤器AuthFilter,里面有这么一段

tokenFeignClient.checkToken(accessToken)

其中tokenFeignClientmall4cloud-api-auth 模块的方法,该接口其实是feign的一个接口,而实现就是mall4cloud-auth进行实现。因为我们说过,我们的认证授权应该是一个统一的服务来的,而这个服务就是mall4cloud-auth服务。也就是说项目启动,几乎是必须启动该项目先的。

配置不需要授权就能访问的url

其实并不是所有url都应该登录才能够被用户所访问到的如浏览商品搜索商品的时候用户是不需要登录就能进行的操作这个时候该怎么办呢我们在回到我们的AuthFilter,里面有一段

List<String> excludePathPatterns = authConfigAdapter.excludePathPatterns();

这里边有个authConfigAdapter其实实现该类就能将对应的连接设置为可以访问,或不可以访问了。

用户角色权限

在用户角色权限的模型中一个用户的权限往往是需要登录才能知道的。也细化到每个url每个方法某个用户是否能够访问。我们的系统有的需要rbac模型有的不需要所以我们提取了一个rbac模型的服务mall4cloud-rbac。我们回到AuthFilter,里面有一段

// 省略...
authConfigAdapter.needRbac() && !checkRbac(userInfoInToken, req.getRequestURI(), req.getMethod())
// 省略...
permissionFeignClient.checkPermission(checkPermissionDTO)
// 省略...

这里面的permissionFeignClient 其实也是一个feign服务用于连接 mall4cloud-rbac 这个服务进行rbac模型的校验。