Nacos权限模块2

  • Nacos权限模块
  • 权限管理
  • 权限管理的实现
  • 数据库操作的实现
  • 分布式数据处理的一致性算法JRaft
  • 分布式数据处理的读写锁
  • 权限配置
  • Nacos源码读后感


Nacos权限模块

上篇介绍了Nacos权限模块的实现逻辑,其中权限校验的实现实现权限管理模块实现的,这篇文章就继续介绍权限管理的实现与权限配置。

权限管理

AuthManager权限管理接口定义在auth模块中,AuthManager接口中仅定义了两个方法login()auth() :

public interface AuthManager {
    /**  登录接口通过请求获取到当前用户  */
    User login(Object request) throws AccessException;
    /** 授权校验接口  */
    void auth(Permission permission, User user) throws AccessException;
}
  1. login()接口,用户用过请求获取当前用户。
  2. auth()接口,进行权限校验。

权限管理的实现

权限管理实现在NacosAuthManager类实现,该类在console模块中。Nacos权限管理使用了Sping的安全框架spring security

内部有三个重要对象:

/** JWT令牌管理   */
    @Autowired
    private JwtTokenManager tokenManager;
    /**  spring security中的权限管理  */
    @Autowired
    private AuthenticationManager authenticationManager;
    /** 角色服务   */
    @Autowired
    private NacosRoleServiceImpl roleService;
  1. tokenManager令牌管理,nacos使用JWT作为令牌。令牌管理中实现了令牌创建令牌解析令牌校验功能。令牌管理集成了AuthConfigs权限配置用来创建令牌,例如:有效期
  2. authenticationManager该对象是spring security中的权限管理类。
  3. roleService 角色管理。内部主要是访问数据库完成用户角色与权限配置的匹配。

角色管理主要涉及到了用户表(users),角色表(roles),权限表(permissions)。内部实现逻辑还是比较简单的。

数据库操作的实现

为什么单独说一下数据库实现,因为Nacos在权限操作时封装了两套数据库实现。

RolePersistService (config模块中)定义了获取角色新增角色删除角色等接口,Nacos为该接口做了两套实现分别是EmbeddedRolePersistServiceImplExternalRolePersistServiceImpl

  1. EmbeddedRolePersistServiceImpl 嵌入式存储实现,也是核心实现方式,其原理就是内部定义了一个DatabaseOperate数据操作者,Naco为该接口做了两个实现分别是分布式实现,和单例实现 ,关系如下图 。
  2. ExternalRolePersistServiceImpl 该接口功能与逻辑与EmbeddedRolePersistServiceImpl 没有差别,这个也符合单一职能原则,只是内部直接使用了Spirng JdbcTemplate 进行实现。

具体使用哪个实现控制在注解

@Conditional(value = ConditionOnExternalStorage.class)

最终控制由nacos的 nacos.standalone 配置项决定

这里重点说明嵌入式实现方式 ,实现关系如下图 :

nacos鉴权配置链接springboot nacos权限_nacos

  1. StandaloneDatabaseOperateImpl 单例实现其实还是JdbcTemplate,然后使用了Spring 的 TransactionTemplate,单例模式并不是重点。生产环境亦不建议使用单例模式。
  2. DistributedDatabaseOperateImpl分布式实现,分布式实现需要保证数据一致性因此使用CP模式实现,Nacos的CP模式使用了 Raft算法。
分布式数据处理的一致性算法JRaft

需要了解CAP原则,CP模型,AP模型的话可以参考 《一文道尽分布式的CAP原则》

JRaft实现流程如下:

nacos鉴权配置链接springboot nacos权限_nacos_02

JRaft 内容过长,后面会出一篇讲解 Raft 协议的文章,尽情期待。

分布式数据处理的读写锁

直接上代码:

private ReentrantReadWriteLock lock = new ReentrantReadWriteLock();
    private ReentrantReadWriteLock.ReadLock readLock = lock.readLock();
    private ReentrantReadWriteLock.WriteLock writeLock = lock.writeLock()

权限配置

auth模块的权限配置类在auth模块的common包中,定义如下(源码太长,我们这里仅摘抄一部分,并且添加注释):

package com.alibaba.nacos.auth.common;
@Configuration
public class AuthConfigs {
  
    @JustForTest
    private static Boolean cachingEnabled = null;
    // 安全证书
    @Value("${nacos.core.auth.default.token.secret.key:}")
    private String secretKey;
    // 安全证书,只是格式不同
    private byte[] secretKeyBytes;
    // 授权token的有效时间默认是18000秒也就是5个小时
    @Value("${nacos.core.auth.default.token.expire.seconds:18000}")
    private long tokenValidityInSeconds;
    // 授权系统类型
    @Value("${nacos.core.auth.system.type:}")
    private String nacosAuthSystemType;
    
    @Value("${nacos.core.auth.server.identity.key:}")
    private String serverIdentityKey;
    
    @Value(("${nacos.core.auth.server.identity.value:}"))
    private String serverIdentityValue;
    // 白名单
    @Value(("${nacos.core.auth.enable.userAgentAuthWhite:true}"))
    private boolean enableUserAgentAuthWhite;
}

配置对象多长具体代码请见 : https://github.com/keepgoon/nacos/blob/develop/auth/src/main/java/com/alibaba/nacos/auth/common/AuthConfigs.java

Nacos源码读后感

巧妙使用工具,将协议与工具结合,例如CP协议与JDK锁结合。

做了分布式与单点的数据操作适配,充分利用了Spring 的注解。