| 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253 |
- const db = require('../plugin/DataBase/db')
- const Redis = require('../plugin/DataBase/Redis')
- class AccessControl {
- parseArray(value) {
- if (Array.isArray(value)) return value
- if (!value) return []
- if (typeof value !== 'string') return []
- try {
- const parsed = JSON.parse(value)
- return Array.isArray(parsed) ? parsed : []
- } catch (_) {
- return []
- }
- }
- normalizeCodes(codes) {
- if (!codes) return []
- const list = Array.isArray(codes) ? codes : [codes]
- return [...new Set(list.map(code => String(code || '').trim()).filter(Boolean))]
- }
- async checkSession(uuid, session) {
- return (await Redis.get(`userSession:${uuid}`)) === session
- }
- async getPermission(uuid) {
- const sql = 'SELECT permission FROM users WHERE uuid = ?'
- const rows = await db.query(sql, [uuid])
- return this.parseArray(rows[0]?.permission)
- }
- async canAccess(uuid, requiredCodes) {
- const codes = this.normalizeCodes(requiredCodes)
- if (codes.length === 0) return true
- const permission = await this.getPermission(uuid)
- if (permission.includes('admin') || permission.includes('service')) return true
- return codes.some(code => permission.includes(code))
- }
- async checkJwAccount(uuid, username) {
- const sql = 'SELECT password FROM jw_account WHERE create_user = ? AND state = 1 AND username = ?'
- const rows = await db.query(sql, [uuid, username]);
- if (!rows || rows.length !== 1 || !rows[0].password)
- return false
- return rows[0]?.password
- }
- }
- module.exports = new AccessControl();
|