智慧水务管理系统 - 精河县供水工程综合管理平台

V3__sso_tables.sql 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. -- SSO单点登录表结构
  2. -- 创建SSO令牌表
  3. CREATE TABLE IF NOT EXISTS sso_token (
  4. id BIGSERIAL PRIMARY KEY,
  5. user_id VARCHAR(50) NOT NULL,
  6. username VARCHAR(100) NOT NULL,
  7. token VARCHAR(500) NOT NULL,
  8. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  9. expire_time TIMESTAMP NOT NULL,
  10. status INTEGER DEFAULT 1,
  11. last_use_time TIMESTAMP,
  12. INDEX idx_token (token),
  13. INDEX idx_user_id (user_id),
  14. INDEX idx_expire_time (expire_time)
  15. );
  16. -- 创建应用注册表
  17. CREATE TABLE IF NOT EXISTS app_registry (
  18. id BIGSERIAL PRIMARY KEY,
  19. app_name VARCHAR(100) NOT NULL UNIQUE,
  20. app_key VARCHAR(200) NOT NULL UNIQUE,
  21. app_secret VARCHAR(500) NOT NULL,
  22. redirect_uri VARCHAR(500) NOT NULL,
  23. description TEXT,
  24. status INTEGER DEFAULT 1,
  25. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  26. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  27. admin_user VARCHAR(100),
  28. INDEX idx_app_key (app_key),
  29. INDEX idx_status (status)
  30. );
  31. -- 创建SSO访问日志表
  32. CREATE TABLE IF NOT EXISTS sso_access_log (
  33. id BIGSERIAL PRIMARY KEY,
  34. user_id VARCHAR(50),
  35. username VARCHAR(100),
  36. app_name VARCHAR(100),
  37. action VARCHAR(50) NOT NULL, -- login, logout, validate, token_exchange
  38. ip_address VARCHAR(50),
  39. user_agent TEXT,
  40. token_used VARCHAR(500),
  41. status INTEGER DEFAULT 1, -- 1:成功, 0:失败
  42. error_message TEXT,
  43. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  44. INDEX idx_user_id (user_id),
  45. INDEX idx_username (username),
  46. INDEX idx_app_name (app_name),
  47. INDEX idx_create_time (create_time)
  48. );
  49. -- 创建应用接入记录表
  50. CREATE TABLE IF NOT EXISTS app_access_log (
  51. id BIGSERIAL PRIMARY KEY,
  52. app_key VARCHAR(200) NOT NULL,
  53. app_name VARCHAR(100) NOT NULL,
  54. client_id VARCHAR(200),
  55. action VARCHAR(50) NOT NULL, -- register, validate, auth, token_request
  56. ip_address VARCHAR(50),
  57. user_agent TEXT,
  58. request_data TEXT,
  59. response_data TEXT,
  60. status INTEGER DEFAULT 1,
  61. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  62. INDEX idx_app_key (app_key),
  63. INDEX idx_create_time (create_time)
  64. );
  65. -- 创建权限配置表
  66. CREATE TABLE IF NOT EXISTS app_permission (
  67. id BIGSERIAL PRIMARY KEY,
  68. app_key VARCHAR(200) NOT NULL,
  69. permission_name VARCHAR(100) NOT NULL,
  70. permission_code VARCHAR(200) NOT NULL,
  71. resource_type VARCHAR(50), -- api, menu, button
  72. resource_id VARCHAR(200),
  73. is_enabled INTEGER DEFAULT 1,
  74. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  75. update_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  76. UNIQUE KEY uk_app_key_permission (app_key, permission_code),
  77. INDEX idx_app_key (app_key),
  78. INDEX idx_permission_code (permission_code)
  79. );
  80. -- 创建Token刷新记录表
  81. CREATE TABLE IF NOT EXISTS refresh_token (
  82. id BIGSERIAL PRIMARY KEY,
  83. user_id VARCHAR(50) NOT NULL,
  84. username VARCHAR(100) NOT NULL,
  85. access_token VARCHAR(500) NOT NULL,
  86. refresh_token VARCHAR(500) NOT NULL,
  87. client_id VARCHAR(200) NOT NULL,
  88. scope VARCHAR(500),
  89. create_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
  90. expire_time TIMESTAMP NOT NULL,
  91. last_use_time TIMESTAMP,
  92. is_revoked INTEGER DEFAULT 0,
  93. INDEX idx_access_token (access_token),
  94. INDEX idx_refresh_token (refresh_token),
  95. INDEX idx_user_id (user_id),
  96. INDEX idx_client_id (client_id)
  97. );
  98. -- 插入默认的OAuth2客户端配置
  99. INSERT INTO app_registry (app_name, app_key, app_secret, redirect_uri, description, admin_user) VALUES
  100. ('营收管理前端', 'revenue-frontend', 'revenue-frontend-secret-2026', 'http://localhost:3000/oauth/callback', '营收管理平台前端应用', 'admin'),
  101. ('微信网厅', 'wechat-mall', 'wechat-mall-secret-2026', 'http://localhost:8080/wechat/callback', '微信网上营业厅应用', 'admin'),
  102. ('移动端应用', 'mobile-app', 'mobile-app-secret-2026', 'http://localhost:4000/auth/callback', '移动端应用', 'admin')
  103. ON CONFLICT (app_name) DO NOTHING;
  104. -- 创建SSO触发器:自动清理过期Token
  105. CREATE OR REPLACE FUNCTION clean_expired_tokens()
  106. RETURNS TRIGGER AS $$
  107. BEGIN
  108. DELETE FROM sso_token WHERE expire_time < NOW();
  109. DELETE FROM refresh_token WHERE expire_time < NOW();
  110. RETURN NEW;
  111. END;
  112. $$ LANGUAGE plpgsql;
  113. -- 创建SSO触发器:当插入token时更新最后使用时间
  114. CREATE OR REPLACE FUNCTION update_last_use_time()
  115. RETURNS TRIGGER AS $$
  116. BEGIN
  117. IF NEW.status = 1 THEN
  118. UPDATE sso_token SET last_use_time = NOW()
  119. WHERE token = NEW.token AND id != NEW.id;
  120. END IF;
  121. RETURN NEW;
  122. END;
  123. $$ LANGUAGE plpgsql;
  124. -- 创建触发器
  125. CREATE TRIGGER trigger_clean_expired_tokens
  126. BEFORE INSERT OR UPDATE OR DELETE ON sso_token
  127. EXECUTE FUNCTION clean_expired_tokens();
  128. CREATE TRIGGER trigger_update_last_use_time
  129. AFTER UPDATE ON sso_token
  130. FOR EACH ROW
  131. EXECUTE FUNCTION update_last_use_time();