介绍

authorizer

IAuthorizer接口提供了所有与授权相关的操作,例如登录、创建用户、给用户赋予权限等操作

BasicAuthorizer实现了IAuthorizer接口,当进行权限操作时,通过userManagerroleManager调用其对应类的权限操作方法。


role

IRoleManager接口维护了与角色权限相关的操作(创建、删除角色等)

BasicRoleManager实现了IRoleManager接口,此类通过 LocalFileRoleAccessor 从本地文件中读取角色,并在哈希映射中对其进行管理。

IRoleAccessor接口管理角色对象的序列化反序列化。

LocalFileRoleAccessor该类对存储在本地data/system/roles下的相关角色信息进行操作


user

IUserManager接口维护了与用户权限相关的操作(创建、删除用户等)

BasicUserManager实现了IUserManager接口,此类将每个用户的信息存储在目录内的单独文件中,并在访问用户时将它们缓存在内存中。

IUserAccessor该接口管理用户对象的序列化反序列化

LocalFileUserAccessor该类对存储在本地data/system/users下的相关用户信息进行操作

登陆

  • 启动服务器,通过启动脚本start-cli.sh来发起一个请求,并由服务器端接收,申请开启一次会话。

  • 创建一个BasicOpenSessionResp对象,用来存储登录是否成功的状态信息,获取一个BasicAuthorizer的实例对象,调用login()方法传递usernamepassword

  • 首先通过用户名获取用户。如果用户名和密码都不为空,就验证从客户端传递过来的密码与通过用户名得到的密码是否相同。

    • 获取用户:通过usernameuserMap中获取用户,如果用户为空,就检查本地有没有该用户,如果本地目录下有用户信息,就把用户信息放入userMap中;如果在usermMap中存在该用户,就设置用户的lastActiveTime为当前时间。

  • 根据返回结果来为BasicOpenSessionResp对象设置对应的成功或失败,sessionId等信息。最后返回openSessionResp对象。

操作

创建用户
  • 首先获取对应的sql语句,生成物理计划

  • 为非查询计划,执行executeNonQuery()

  • 执行processNonQuery(),进行下一步操作

  • 根据计划类型,选择对应的操作createUser(),并传递usernamepassword

  • 创建用户,如果返回false,就证明用户已经被创建,抛出异常

    • 验证用户名和密码是否符合规范

    • 根据用户名先获取用户,如果用户存在,就不可以再继续创建用户

    • 如果获取的用户为空,根据用户名和密码创建一个新的User对象

    • 将用户保存,写入本地的data/system/users/目录下,生成对应用户的profile文件。

    • 放入userMap

创建角色

与创建用户相似,可做参考。

更新用户密码
  • 新密码不可以小于4位,不可以包含空格

  • 通过用户民获取用户

  • 在更新的过程中,先保存用户原来的密码,防止在更新密码时,出现错误,可以将旧的密码赋值回去。

  • 用户密码更新成功后,保存在本地

删除用户
  • 如果删除的是root默认用户,抛出异常。

  • 如果删除的用户存在,就删除本地data/system/下保存的相关用户信息,并在userMap中移除该用户。

删除角色
  • 删除本地存储的角色信息,在roleMap中移除角色信息

  • 如果删除成功,就遍历所有的用户,将该角色从所有的用户中移除。

赋予用户权限
  • 如果是赋予root用户权限,就会抛出异常,因为root用户拥有所有的权限

  • 检查该权限是否需要seriesPath作为参数,如果不需要权限的路径,则会将newPath设置为root

  • 赋予用户权限

    • 验证该路径上的权限是否合法

    • 通过用户名获取用户

    • 遍历用户的权限列表,如果用户已经有权限,则返回false

    • 为用户加入权限

      • 创建一个PathPrivilege对象,将privilegeId赋值给它

      • 在这个用户的privilegeList里加入刚创建的PathPrivilege对象

    • 保存在本地

赋予角色权限

与赋予用户权限相似,可参考赋予用户权限

赋予用户角色
  • 根据角色名获取到角色

  • 为用户赋予角色

    • 根据用户名获取用户

    • 检查用户是否有该角色

    • 为用户的roleList添加这个角色

    • 保存在本地

  • 赋予成功,再次根据角色名获取角色,检查是否为空,防止角色在赋予用户之前被删除

撤销用户角色
  • 根据角色名获取对应的角色

  • 移除用户角色

    • 根据用户名获取对应的用户

    • 检查用户是否包含该角色

    • 将用户的roleList的对应角色移除掉

    • 保存在本地




撤销用户权限
  • 检查是否为root用户

  • 检查该权限是否需要seriesPath作为参数,如果不需要,则将路径设置为root

  • 撤销用户的权限

    • 验证该路径上的权限是否合法

    • 根据用户名获取用户

    • 如果这个用户没有这个权限,则返回false

    • 移除用户的权限

      • 创建一个空的PathPrivilege对象emptyPrivilege

      • 遍历用户的privilegeList

      • 遍历到要移除权限的'path,将对应的权限进行移除

      • 如果移除权限后,pathPrivilege为空,说明该路径上不包含任何的权限,将pathPrivilege赋值给emptyPrivilege

      • 如果emptyPrivilege不为空,则在这个用户的privilegeList里移除对应的emptyPrivilege

  • 保存在本地

撤销角色权限

与撤销用户权限相似,可参考插销用户权限

列出用户
  • 检查当前用户是否被授予 list_user 权限

  • 查询所有用户

    • 获取用户在本地的路径data/system/users

    • 获取对应本地该路径下所有的用户文件名,组成一个数组

    • 创建Set集合set,遍历数组,将该文件名的后缀去除,并将去除后的名字放入set

    • 将得到的set放入列表中,返回结果

  • 将列表排序

查询所有角色

与查询所有用户相似,参考查询所有用户

列出用户角色
  • 根据用户名获取用户

  • 遍历用户的roleList,将得到的结果放进结果集返回

列出角色用户
  • 根据角色名获取用户

  • 获取所有的用户

  • 遍历userList,如果用户不为空,且用户拥有该角色,将该对应的该用户名,放入结果集

  • 循环完毕后,返回结果集

列出用户权限
  • 根据用户名获取用户

  • 创建对应的结果集头

  • 遍历该用户的privilegeList

    • 如果path不为空,且它的全路径属于对应用户权限中的路径,创建对应的record,放入结果集中

  • 遍历用户的roleList,通过对应的角色名获取对应的角色,并将角色的privilegeList进行遍历

    • 如果path不为空,且它的全路径属于对应角色权限中的路径,创建对应的record,放入结果集中

  • 返回结果集


列出角色权限
  • 首先根据角色名获取对应的角色

  • 创建对应的结果集头

  • 将角色的privilegeList进行遍历,如果path不为空,且它的全路径属于对应角色权限中的路径,创建对应的record,放入结果集中

  • 返回结果集

  • No labels