AccessControl.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253
  1. const db = require('../plugin/DataBase/db')
  2. const Redis = require('../plugin/DataBase/Redis')
  3. class AccessControl {
  4. parseArray(value) {
  5. if (Array.isArray(value)) return value
  6. if (!value) return []
  7. if (typeof value !== 'string') return []
  8. try {
  9. const parsed = JSON.parse(value)
  10. return Array.isArray(parsed) ? parsed : []
  11. } catch (_) {
  12. return []
  13. }
  14. }
  15. normalizeCodes(codes) {
  16. if (!codes) return []
  17. const list = Array.isArray(codes) ? codes : [codes]
  18. return [...new Set(list.map(code => String(code || '').trim()).filter(Boolean))]
  19. }
  20. async checkSession(uuid, session) {
  21. return (await Redis.get(`userSession:${uuid}`)) === session
  22. }
  23. async getPermission(uuid) {
  24. const sql = 'SELECT permission FROM users WHERE uuid = ?'
  25. const rows = await db.query(sql, [uuid])
  26. return this.parseArray(rows[0]?.permission)
  27. }
  28. async canAccess(uuid, requiredCodes) {
  29. const codes = this.normalizeCodes(requiredCodes)
  30. if (codes.length === 0) return true
  31. const permission = await this.getPermission(uuid)
  32. if (permission.includes('admin') || permission.includes('service')) return true
  33. return codes.some(code => permission.includes(code))
  34. }
  35. async checkJwAccount(uuid, username) {
  36. const sql = 'SELECT password FROM jw_account WHERE create_user = ? AND state = 1 AND username = ?'
  37. const rows = await db.query(sql, [uuid, username]);
  38. if (!rows || rows.length !== 1 || !rows[0].password)
  39. return false
  40. return rows[0]?.password
  41. }
  42. }
  43. module.exports = new AccessControl();