@lytjs/plugin-auth 5.0.1 → 6.4.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.cjs +133 -1
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +52 -0
- package/dist/index.d.ts +52 -0
- package/dist/index.mjs +128 -1
- package/dist/index.mjs.map +1 -0
- package/package.json +33 -24
- package/README.md +0 -151
- package/dist/types/index.d.ts +0 -90
- package/dist/types/index.d.ts.map +0 -1
package/dist/index.cjs
CHANGED
|
@@ -1 +1,133 @@
|
|
|
1
|
-
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, '__esModule', { value: true });
|
|
4
|
+
|
|
5
|
+
var core = require('@lytjs/core');
|
|
6
|
+
var reactivity = require('@lytjs/reactivity');
|
|
7
|
+
|
|
8
|
+
// src/index.ts
|
|
9
|
+
function createAuth(options = {}) {
|
|
10
|
+
const {
|
|
11
|
+
initialUser = null,
|
|
12
|
+
storageKey = "lyt-user",
|
|
13
|
+
enablePersistence = false,
|
|
14
|
+
superAdminRole = "super-admin"
|
|
15
|
+
} = options;
|
|
16
|
+
const userSignal = reactivity.signal(initialUser);
|
|
17
|
+
const isAuthenticatedSignal = reactivity.signal(!!initialUser);
|
|
18
|
+
function getStoredUser() {
|
|
19
|
+
if (!enablePersistence || typeof localStorage === "undefined") return null;
|
|
20
|
+
try {
|
|
21
|
+
const stored = localStorage.getItem(storageKey);
|
|
22
|
+
return stored ? JSON.parse(stored) : null;
|
|
23
|
+
} catch {
|
|
24
|
+
return null;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
function saveUser(user) {
|
|
28
|
+
if (!enablePersistence || typeof localStorage === "undefined") return;
|
|
29
|
+
try {
|
|
30
|
+
if (user) {
|
|
31
|
+
localStorage.setItem(storageKey, JSON.stringify(user));
|
|
32
|
+
} else {
|
|
33
|
+
localStorage.removeItem(storageKey);
|
|
34
|
+
}
|
|
35
|
+
} catch {
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
function login(user) {
|
|
39
|
+
userSignal.set(user);
|
|
40
|
+
isAuthenticatedSignal.set(true);
|
|
41
|
+
saveUser(user);
|
|
42
|
+
}
|
|
43
|
+
function logout() {
|
|
44
|
+
userSignal.set(null);
|
|
45
|
+
isAuthenticatedSignal.set(false);
|
|
46
|
+
saveUser(null);
|
|
47
|
+
}
|
|
48
|
+
function hasRole(role) {
|
|
49
|
+
const user = userSignal();
|
|
50
|
+
if (!user) return false;
|
|
51
|
+
if (user.roles.includes(superAdminRole)) return true;
|
|
52
|
+
const roles = Array.isArray(role) ? role : [role];
|
|
53
|
+
return roles.some((r) => user.roles.includes(r));
|
|
54
|
+
}
|
|
55
|
+
function hasAllRoles(roles) {
|
|
56
|
+
const user = userSignal();
|
|
57
|
+
if (!user) return false;
|
|
58
|
+
if (user.roles.includes(superAdminRole)) return true;
|
|
59
|
+
return roles.every((r) => user.roles.includes(r));
|
|
60
|
+
}
|
|
61
|
+
function hasPermission(permission) {
|
|
62
|
+
const user = userSignal();
|
|
63
|
+
if (!user) return false;
|
|
64
|
+
if (user.roles.includes(superAdminRole)) return true;
|
|
65
|
+
const permissions = Array.isArray(permission) ? permission : [permission];
|
|
66
|
+
return permissions.some((p) => user.permissions.includes(p));
|
|
67
|
+
}
|
|
68
|
+
function hasAllPermissions(permissions) {
|
|
69
|
+
const user = userSignal();
|
|
70
|
+
if (!user) return false;
|
|
71
|
+
if (user.roles.includes(superAdminRole)) return true;
|
|
72
|
+
return permissions.every((p) => user.permissions.includes(p));
|
|
73
|
+
}
|
|
74
|
+
function updateUser(partialUser) {
|
|
75
|
+
const currentUser = userSignal();
|
|
76
|
+
if (!currentUser) return;
|
|
77
|
+
const newUser = { ...currentUser, ...partialUser };
|
|
78
|
+
userSignal.set(newUser);
|
|
79
|
+
saveUser(newUser);
|
|
80
|
+
}
|
|
81
|
+
function init() {
|
|
82
|
+
const storedUser = getStoredUser();
|
|
83
|
+
if (storedUser) {
|
|
84
|
+
userSignal.set(storedUser);
|
|
85
|
+
isAuthenticatedSignal.set(true);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
init();
|
|
89
|
+
return {
|
|
90
|
+
get user() {
|
|
91
|
+
return userSignal();
|
|
92
|
+
},
|
|
93
|
+
get isAuthenticated() {
|
|
94
|
+
return isAuthenticatedSignal();
|
|
95
|
+
},
|
|
96
|
+
login,
|
|
97
|
+
logout,
|
|
98
|
+
hasRole,
|
|
99
|
+
hasPermission,
|
|
100
|
+
hasAllRoles,
|
|
101
|
+
hasAllPermissions,
|
|
102
|
+
updateUser
|
|
103
|
+
};
|
|
104
|
+
}
|
|
105
|
+
var pluginAuth = core.definePlugin({
|
|
106
|
+
name: "auth",
|
|
107
|
+
version: "6.0.0",
|
|
108
|
+
description: "LytJS official auth plugin for route authorization, permission checking, and role management",
|
|
109
|
+
author: "LytJS Team",
|
|
110
|
+
keywords: ["lytjs", "auth", "authorization", "permission", "role"],
|
|
111
|
+
schema: {
|
|
112
|
+
type: "object",
|
|
113
|
+
object: {
|
|
114
|
+
properties: {
|
|
115
|
+
initialUser: { type: "object", default: null },
|
|
116
|
+
storageKey: { type: "string", default: "lyt-user" },
|
|
117
|
+
enablePersistence: { type: "boolean", default: false },
|
|
118
|
+
superAdminRole: { type: "string", default: "super-admin" }
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
},
|
|
122
|
+
install(app, options) {
|
|
123
|
+
const auth = createAuth(options);
|
|
124
|
+
app.config.globalProperties.$auth = auth;
|
|
125
|
+
app.provide("lyt-auth", auth);
|
|
126
|
+
}
|
|
127
|
+
});
|
|
128
|
+
var index_default = pluginAuth;
|
|
129
|
+
|
|
130
|
+
exports.createAuth = createAuth;
|
|
131
|
+
exports.default = index_default;
|
|
132
|
+
//# sourceMappingURL=index.cjs.map
|
|
133
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":["signal","definePlugin"],"mappings":"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","file":"index.cjs","sourcesContent":["/**\r\n * @lytjs/plugin-auth\r\n *\r\n * LytJS official auth plugin for route authorization, permission checking, and role management.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport { signal } from '@lytjs/reactivity';\r\nimport type { User, AuthOptions, AuthInstance } from './types';\r\n\r\nfunction createAuth(options: AuthOptions = {}): AuthInstance {\r\n const {\r\n initialUser = null,\r\n storageKey = 'lyt-user',\r\n enablePersistence = false,\r\n superAdminRole = 'super-admin',\r\n } = options;\r\n\r\n const userSignal = signal<User | null>(initialUser);\r\n const isAuthenticatedSignal = signal<boolean>(!!initialUser);\r\n\r\n function getStoredUser(): User | null {\r\n if (!enablePersistence || typeof localStorage === 'undefined') return null;\r\n try {\r\n const stored = localStorage.getItem(storageKey);\r\n return stored ? JSON.parse(stored) : null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n function saveUser(user: User | null) {\r\n if (!enablePersistence || typeof localStorage === 'undefined') return;\r\n try {\r\n if (user) {\r\n localStorage.setItem(storageKey, JSON.stringify(user));\r\n } else {\r\n localStorage.removeItem(storageKey);\r\n }\r\n } catch {\r\n }\r\n }\r\n\r\n function login(user: User) {\r\n userSignal.set(user);\r\n isAuthenticatedSignal.set(true);\r\n saveUser(user);\r\n }\r\n\r\n function logout() {\r\n userSignal.set(null);\r\n isAuthenticatedSignal.set(false);\r\n saveUser(null);\r\n }\r\n\r\n function hasRole(role: string | string[]): boolean {\r\n const user = userSignal();\r\n if (!user) return false;\r\n\r\n if (user.roles.includes(superAdminRole)) return true;\r\n\r\n const roles = Array.isArray(role) ? role : [role];\r\n return roles.some((r) => user.roles.includes(r));\r\n }\r\n\r\n function hasAllRoles(roles: string[]): boolean {\r\n const user = userSignal();\r\n if (!user) return false;\r\n\r\n if (user.roles.includes(superAdminRole)) return true;\r\n\r\n return roles.every((r) => user.roles.includes(r));\r\n }\r\n\r\n function hasPermission(permission: string | string[]): boolean {\r\n const user = userSignal();\r\n if (!user) return false;\r\n\r\n if (user.roles.includes(superAdminRole)) return true;\r\n\r\n const permissions = Array.isArray(permission) ? permission : [permission];\r\n return permissions.some((p) => user.permissions.includes(p));\r\n }\r\n\r\n function hasAllPermissions(permissions: string[]): boolean {\r\n const user = userSignal();\r\n if (!user) return false;\r\n\r\n if (user.roles.includes(superAdminRole)) return true;\r\n\r\n return permissions.every((p) => user.permissions.includes(p));\r\n }\r\n\r\n function updateUser(partialUser: Partial<User>) {\r\n const currentUser = userSignal();\r\n if (!currentUser) return;\r\n\r\n const newUser = { ...currentUser, ...partialUser };\r\n userSignal.set(newUser);\r\n saveUser(newUser);\r\n }\r\n\r\n function init() {\r\n const storedUser = getStoredUser();\r\n if (storedUser) {\r\n userSignal.set(storedUser);\r\n isAuthenticatedSignal.set(true);\r\n }\r\n }\r\n\r\n init();\r\n\r\n return {\r\n get user() {\r\n return userSignal();\r\n },\r\n get isAuthenticated() {\r\n return isAuthenticatedSignal();\r\n },\r\n login,\r\n logout,\r\n hasRole,\r\n hasPermission,\r\n hasAllRoles,\r\n hasAllPermissions,\r\n updateUser,\r\n };\r\n}\r\n\r\nconst pluginAuth = definePlugin({\r\n name: 'auth',\r\n version: '6.0.0',\r\n description: 'LytJS official auth plugin for route authorization, permission checking, and role management',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'auth', 'authorization', 'permission', 'role'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n initialUser: { type: 'object', default: null },\r\n storageKey: { type: 'string', default: 'lyt-user' },\r\n enablePersistence: { type: 'boolean', default: false },\r\n superAdminRole: { type: 'string', default: 'super-admin' },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const auth = createAuth(options as AuthOptions);\r\n\r\n app.config.globalProperties.$auth = auth;\r\n\r\n app.provide('lyt-auth', auth);\r\n },\r\n});\r\n\r\nexport default pluginAuth;\r\nexport type { User, AuthOptions, AuthInstance };\r\nexport { createAuth };\r\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as _lytjs_core from '@lytjs/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @lytjs/plugin-auth - 类型定义
|
|
5
|
+
*/
|
|
6
|
+
interface User {
|
|
7
|
+
/** 用户 ID */
|
|
8
|
+
id: string | number;
|
|
9
|
+
/** 用户名 */
|
|
10
|
+
username?: string;
|
|
11
|
+
/** 角色列表 */
|
|
12
|
+
roles: string[];
|
|
13
|
+
/** 权限列表 */
|
|
14
|
+
permissions: string[];
|
|
15
|
+
/** 附加数据 */
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
interface AuthOptions {
|
|
19
|
+
/** 初始用户 */
|
|
20
|
+
initialUser?: User | null;
|
|
21
|
+
/** 持久化 key */
|
|
22
|
+
storageKey?: string;
|
|
23
|
+
/** 是否启用持久化 */
|
|
24
|
+
enablePersistence?: boolean;
|
|
25
|
+
/** 超级管理员角色 */
|
|
26
|
+
superAdminRole?: string;
|
|
27
|
+
}
|
|
28
|
+
interface AuthInstance {
|
|
29
|
+
/** 当前用户 */
|
|
30
|
+
user: User | null;
|
|
31
|
+
/** 是否已登录 */
|
|
32
|
+
isAuthenticated: boolean;
|
|
33
|
+
/** 登录 */
|
|
34
|
+
login: (user: User) => void;
|
|
35
|
+
/** 登出 */
|
|
36
|
+
logout: () => void;
|
|
37
|
+
/** 检查角色 */
|
|
38
|
+
hasRole: (role: string | string[]) => boolean;
|
|
39
|
+
/** 检查权限 */
|
|
40
|
+
hasPermission: (permission: string | string[]) => boolean;
|
|
41
|
+
/** 检查所有角色 */
|
|
42
|
+
hasAllRoles: (roles: string[]) => boolean;
|
|
43
|
+
/** 检查所有权限 */
|
|
44
|
+
hasAllPermissions: (permissions: string[]) => boolean;
|
|
45
|
+
/** 更新用户信息 */
|
|
46
|
+
updateUser: (user: Partial<User>) => void;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
declare function createAuth(options?: AuthOptions): AuthInstance;
|
|
50
|
+
declare const pluginAuth: _lytjs_core.PluginDefinition<unknown>;
|
|
51
|
+
|
|
52
|
+
export { type AuthInstance, type AuthOptions, type User, createAuth, pluginAuth as default };
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import * as _lytjs_core from '@lytjs/core';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* @lytjs/plugin-auth - 类型定义
|
|
5
|
+
*/
|
|
6
|
+
interface User {
|
|
7
|
+
/** 用户 ID */
|
|
8
|
+
id: string | number;
|
|
9
|
+
/** 用户名 */
|
|
10
|
+
username?: string;
|
|
11
|
+
/** 角色列表 */
|
|
12
|
+
roles: string[];
|
|
13
|
+
/** 权限列表 */
|
|
14
|
+
permissions: string[];
|
|
15
|
+
/** 附加数据 */
|
|
16
|
+
[key: string]: unknown;
|
|
17
|
+
}
|
|
18
|
+
interface AuthOptions {
|
|
19
|
+
/** 初始用户 */
|
|
20
|
+
initialUser?: User | null;
|
|
21
|
+
/** 持久化 key */
|
|
22
|
+
storageKey?: string;
|
|
23
|
+
/** 是否启用持久化 */
|
|
24
|
+
enablePersistence?: boolean;
|
|
25
|
+
/** 超级管理员角色 */
|
|
26
|
+
superAdminRole?: string;
|
|
27
|
+
}
|
|
28
|
+
interface AuthInstance {
|
|
29
|
+
/** 当前用户 */
|
|
30
|
+
user: User | null;
|
|
31
|
+
/** 是否已登录 */
|
|
32
|
+
isAuthenticated: boolean;
|
|
33
|
+
/** 登录 */
|
|
34
|
+
login: (user: User) => void;
|
|
35
|
+
/** 登出 */
|
|
36
|
+
logout: () => void;
|
|
37
|
+
/** 检查角色 */
|
|
38
|
+
hasRole: (role: string | string[]) => boolean;
|
|
39
|
+
/** 检查权限 */
|
|
40
|
+
hasPermission: (permission: string | string[]) => boolean;
|
|
41
|
+
/** 检查所有角色 */
|
|
42
|
+
hasAllRoles: (roles: string[]) => boolean;
|
|
43
|
+
/** 检查所有权限 */
|
|
44
|
+
hasAllPermissions: (permissions: string[]) => boolean;
|
|
45
|
+
/** 更新用户信息 */
|
|
46
|
+
updateUser: (user: Partial<User>) => void;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
declare function createAuth(options?: AuthOptions): AuthInstance;
|
|
50
|
+
declare const pluginAuth: _lytjs_core.PluginDefinition<unknown>;
|
|
51
|
+
|
|
52
|
+
export { type AuthInstance, type AuthOptions, type User, createAuth, pluginAuth as default };
|
package/dist/index.mjs
CHANGED
|
@@ -1 +1,128 @@
|
|
|
1
|
-
|
|
1
|
+
import { definePlugin } from '@lytjs/core';
|
|
2
|
+
import { signal } from '@lytjs/reactivity';
|
|
3
|
+
|
|
4
|
+
// src/index.ts
|
|
5
|
+
function createAuth(options = {}) {
|
|
6
|
+
const {
|
|
7
|
+
initialUser = null,
|
|
8
|
+
storageKey = "lyt-user",
|
|
9
|
+
enablePersistence = false,
|
|
10
|
+
superAdminRole = "super-admin"
|
|
11
|
+
} = options;
|
|
12
|
+
const userSignal = signal(initialUser);
|
|
13
|
+
const isAuthenticatedSignal = signal(!!initialUser);
|
|
14
|
+
function getStoredUser() {
|
|
15
|
+
if (!enablePersistence || typeof localStorage === "undefined") return null;
|
|
16
|
+
try {
|
|
17
|
+
const stored = localStorage.getItem(storageKey);
|
|
18
|
+
return stored ? JSON.parse(stored) : null;
|
|
19
|
+
} catch {
|
|
20
|
+
return null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function saveUser(user) {
|
|
24
|
+
if (!enablePersistence || typeof localStorage === "undefined") return;
|
|
25
|
+
try {
|
|
26
|
+
if (user) {
|
|
27
|
+
localStorage.setItem(storageKey, JSON.stringify(user));
|
|
28
|
+
} else {
|
|
29
|
+
localStorage.removeItem(storageKey);
|
|
30
|
+
}
|
|
31
|
+
} catch {
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
function login(user) {
|
|
35
|
+
userSignal.set(user);
|
|
36
|
+
isAuthenticatedSignal.set(true);
|
|
37
|
+
saveUser(user);
|
|
38
|
+
}
|
|
39
|
+
function logout() {
|
|
40
|
+
userSignal.set(null);
|
|
41
|
+
isAuthenticatedSignal.set(false);
|
|
42
|
+
saveUser(null);
|
|
43
|
+
}
|
|
44
|
+
function hasRole(role) {
|
|
45
|
+
const user = userSignal();
|
|
46
|
+
if (!user) return false;
|
|
47
|
+
if (user.roles.includes(superAdminRole)) return true;
|
|
48
|
+
const roles = Array.isArray(role) ? role : [role];
|
|
49
|
+
return roles.some((r) => user.roles.includes(r));
|
|
50
|
+
}
|
|
51
|
+
function hasAllRoles(roles) {
|
|
52
|
+
const user = userSignal();
|
|
53
|
+
if (!user) return false;
|
|
54
|
+
if (user.roles.includes(superAdminRole)) return true;
|
|
55
|
+
return roles.every((r) => user.roles.includes(r));
|
|
56
|
+
}
|
|
57
|
+
function hasPermission(permission) {
|
|
58
|
+
const user = userSignal();
|
|
59
|
+
if (!user) return false;
|
|
60
|
+
if (user.roles.includes(superAdminRole)) return true;
|
|
61
|
+
const permissions = Array.isArray(permission) ? permission : [permission];
|
|
62
|
+
return permissions.some((p) => user.permissions.includes(p));
|
|
63
|
+
}
|
|
64
|
+
function hasAllPermissions(permissions) {
|
|
65
|
+
const user = userSignal();
|
|
66
|
+
if (!user) return false;
|
|
67
|
+
if (user.roles.includes(superAdminRole)) return true;
|
|
68
|
+
return permissions.every((p) => user.permissions.includes(p));
|
|
69
|
+
}
|
|
70
|
+
function updateUser(partialUser) {
|
|
71
|
+
const currentUser = userSignal();
|
|
72
|
+
if (!currentUser) return;
|
|
73
|
+
const newUser = { ...currentUser, ...partialUser };
|
|
74
|
+
userSignal.set(newUser);
|
|
75
|
+
saveUser(newUser);
|
|
76
|
+
}
|
|
77
|
+
function init() {
|
|
78
|
+
const storedUser = getStoredUser();
|
|
79
|
+
if (storedUser) {
|
|
80
|
+
userSignal.set(storedUser);
|
|
81
|
+
isAuthenticatedSignal.set(true);
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
init();
|
|
85
|
+
return {
|
|
86
|
+
get user() {
|
|
87
|
+
return userSignal();
|
|
88
|
+
},
|
|
89
|
+
get isAuthenticated() {
|
|
90
|
+
return isAuthenticatedSignal();
|
|
91
|
+
},
|
|
92
|
+
login,
|
|
93
|
+
logout,
|
|
94
|
+
hasRole,
|
|
95
|
+
hasPermission,
|
|
96
|
+
hasAllRoles,
|
|
97
|
+
hasAllPermissions,
|
|
98
|
+
updateUser
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
var pluginAuth = definePlugin({
|
|
102
|
+
name: "auth",
|
|
103
|
+
version: "6.0.0",
|
|
104
|
+
description: "LytJS official auth plugin for route authorization, permission checking, and role management",
|
|
105
|
+
author: "LytJS Team",
|
|
106
|
+
keywords: ["lytjs", "auth", "authorization", "permission", "role"],
|
|
107
|
+
schema: {
|
|
108
|
+
type: "object",
|
|
109
|
+
object: {
|
|
110
|
+
properties: {
|
|
111
|
+
initialUser: { type: "object", default: null },
|
|
112
|
+
storageKey: { type: "string", default: "lyt-user" },
|
|
113
|
+
enablePersistence: { type: "boolean", default: false },
|
|
114
|
+
superAdminRole: { type: "string", default: "super-admin" }
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
},
|
|
118
|
+
install(app, options) {
|
|
119
|
+
const auth = createAuth(options);
|
|
120
|
+
app.config.globalProperties.$auth = auth;
|
|
121
|
+
app.provide("lyt-auth", auth);
|
|
122
|
+
}
|
|
123
|
+
});
|
|
124
|
+
var index_default = pluginAuth;
|
|
125
|
+
|
|
126
|
+
export { createAuth, index_default as default };
|
|
127
|
+
//# sourceMappingURL=index.mjs.map
|
|
128
|
+
//# sourceMappingURL=index.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/index.ts"],"names":[],"mappings":"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","file":"index.mjs","sourcesContent":["/**\r\n * @lytjs/plugin-auth\r\n *\r\n * LytJS official auth plugin for route authorization, permission checking, and role management.\r\n *\r\n * @packageDocumentation\r\n */\r\n\r\nimport { definePlugin } from '@lytjs/core';\r\nimport { signal } from '@lytjs/reactivity';\r\nimport type { User, AuthOptions, AuthInstance } from './types';\r\n\r\nfunction createAuth(options: AuthOptions = {}): AuthInstance {\r\n const {\r\n initialUser = null,\r\n storageKey = 'lyt-user',\r\n enablePersistence = false,\r\n superAdminRole = 'super-admin',\r\n } = options;\r\n\r\n const userSignal = signal<User | null>(initialUser);\r\n const isAuthenticatedSignal = signal<boolean>(!!initialUser);\r\n\r\n function getStoredUser(): User | null {\r\n if (!enablePersistence || typeof localStorage === 'undefined') return null;\r\n try {\r\n const stored = localStorage.getItem(storageKey);\r\n return stored ? JSON.parse(stored) : null;\r\n } catch {\r\n return null;\r\n }\r\n }\r\n\r\n function saveUser(user: User | null) {\r\n if (!enablePersistence || typeof localStorage === 'undefined') return;\r\n try {\r\n if (user) {\r\n localStorage.setItem(storageKey, JSON.stringify(user));\r\n } else {\r\n localStorage.removeItem(storageKey);\r\n }\r\n } catch {\r\n }\r\n }\r\n\r\n function login(user: User) {\r\n userSignal.set(user);\r\n isAuthenticatedSignal.set(true);\r\n saveUser(user);\r\n }\r\n\r\n function logout() {\r\n userSignal.set(null);\r\n isAuthenticatedSignal.set(false);\r\n saveUser(null);\r\n }\r\n\r\n function hasRole(role: string | string[]): boolean {\r\n const user = userSignal();\r\n if (!user) return false;\r\n\r\n if (user.roles.includes(superAdminRole)) return true;\r\n\r\n const roles = Array.isArray(role) ? role : [role];\r\n return roles.some((r) => user.roles.includes(r));\r\n }\r\n\r\n function hasAllRoles(roles: string[]): boolean {\r\n const user = userSignal();\r\n if (!user) return false;\r\n\r\n if (user.roles.includes(superAdminRole)) return true;\r\n\r\n return roles.every((r) => user.roles.includes(r));\r\n }\r\n\r\n function hasPermission(permission: string | string[]): boolean {\r\n const user = userSignal();\r\n if (!user) return false;\r\n\r\n if (user.roles.includes(superAdminRole)) return true;\r\n\r\n const permissions = Array.isArray(permission) ? permission : [permission];\r\n return permissions.some((p) => user.permissions.includes(p));\r\n }\r\n\r\n function hasAllPermissions(permissions: string[]): boolean {\r\n const user = userSignal();\r\n if (!user) return false;\r\n\r\n if (user.roles.includes(superAdminRole)) return true;\r\n\r\n return permissions.every((p) => user.permissions.includes(p));\r\n }\r\n\r\n function updateUser(partialUser: Partial<User>) {\r\n const currentUser = userSignal();\r\n if (!currentUser) return;\r\n\r\n const newUser = { ...currentUser, ...partialUser };\r\n userSignal.set(newUser);\r\n saveUser(newUser);\r\n }\r\n\r\n function init() {\r\n const storedUser = getStoredUser();\r\n if (storedUser) {\r\n userSignal.set(storedUser);\r\n isAuthenticatedSignal.set(true);\r\n }\r\n }\r\n\r\n init();\r\n\r\n return {\r\n get user() {\r\n return userSignal();\r\n },\r\n get isAuthenticated() {\r\n return isAuthenticatedSignal();\r\n },\r\n login,\r\n logout,\r\n hasRole,\r\n hasPermission,\r\n hasAllRoles,\r\n hasAllPermissions,\r\n updateUser,\r\n };\r\n}\r\n\r\nconst pluginAuth = definePlugin({\r\n name: 'auth',\r\n version: '6.0.0',\r\n description: 'LytJS official auth plugin for route authorization, permission checking, and role management',\r\n author: 'LytJS Team',\r\n keywords: ['lytjs', 'auth', 'authorization', 'permission', 'role'],\r\n schema: {\r\n type: 'object',\r\n object: {\r\n properties: {\r\n initialUser: { type: 'object', default: null },\r\n storageKey: { type: 'string', default: 'lyt-user' },\r\n enablePersistence: { type: 'boolean', default: false },\r\n superAdminRole: { type: 'string', default: 'super-admin' },\r\n },\r\n },\r\n },\r\n install(app, options) {\r\n const auth = createAuth(options as AuthOptions);\r\n\r\n app.config.globalProperties.$auth = auth;\r\n\r\n app.provide('lyt-auth', auth);\r\n },\r\n});\r\n\r\nexport default pluginAuth;\r\nexport type { User, AuthOptions, AuthInstance };\r\nexport { createAuth };\r\n"]}
|
package/package.json
CHANGED
|
@@ -1,45 +1,54 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lytjs/plugin-auth",
|
|
3
|
-
"version": "
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "6.4.0",
|
|
4
|
+
"description": "LytJS official auth plugin for route authorization, permission checking, and role management",
|
|
5
|
+
"type": "module",
|
|
5
6
|
"main": "./dist/index.cjs",
|
|
6
7
|
"module": "./dist/index.mjs",
|
|
7
|
-
"types": "./dist/
|
|
8
|
+
"types": "./dist/index.d.ts",
|
|
8
9
|
"exports": {
|
|
9
10
|
".": {
|
|
10
|
-
"types": "./dist/
|
|
11
|
+
"types": "./dist/index.d.ts",
|
|
11
12
|
"import": "./dist/index.mjs",
|
|
12
|
-
"require": "./dist/index.cjs"
|
|
13
|
-
|
|
14
|
-
|
|
13
|
+
"require": "./dist/index.cjs"
|
|
14
|
+
},
|
|
15
|
+
"./package.json": "./package.json"
|
|
15
16
|
},
|
|
16
|
-
"sideEffects": false,
|
|
17
17
|
"files": [
|
|
18
18
|
"dist"
|
|
19
19
|
],
|
|
20
|
+
"sideEffects": false,
|
|
21
|
+
"scripts": {
|
|
22
|
+
"build": "tsup",
|
|
23
|
+
"dev": "tsup --watch",
|
|
24
|
+
"test": "vitest run",
|
|
25
|
+
"test:watch": "vitest",
|
|
26
|
+
"test:coverage": "vitest run --coverage",
|
|
27
|
+
"type-check": "tsc --noEmit",
|
|
28
|
+
"lint": "eslint \"src/**/*.ts\"",
|
|
29
|
+
"clean": "rm -rf dist"
|
|
30
|
+
},
|
|
31
|
+
"dependencies": {
|
|
32
|
+
"@lytjs/core": "^6.0.0",
|
|
33
|
+
"@lytjs/reactivity": "^6.0.0",
|
|
34
|
+
"@lytjs/common-is": "^6.0.0"
|
|
35
|
+
},
|
|
36
|
+
"devDependencies": {
|
|
37
|
+
"tsup": "^8.0.0",
|
|
38
|
+
"typescript": "^5.4.0",
|
|
39
|
+
"vitest": "^3.0.0"
|
|
40
|
+
},
|
|
20
41
|
"license": "MIT",
|
|
21
|
-
"author": "lytjs",
|
|
22
42
|
"repository": {
|
|
23
43
|
"type": "git",
|
|
24
|
-
"url": "https://gitee.com/lytjs/lytjs"
|
|
44
|
+
"url": "https://gitee.com/lytjs/lytjs.git",
|
|
45
|
+
"directory": "packages/plugins/packages/plugin-auth"
|
|
25
46
|
},
|
|
26
|
-
"homepage": "https://gitee.com/lytjs/lytjs",
|
|
27
47
|
"keywords": [
|
|
28
|
-
"lyt",
|
|
29
48
|
"lytjs",
|
|
30
|
-
"javascript",
|
|
31
|
-
"framework",
|
|
32
|
-
"frontend",
|
|
33
|
-
"vue-like",
|
|
34
|
-
"lightweight",
|
|
35
|
-
"zero-dependency",
|
|
36
49
|
"auth",
|
|
37
|
-
"authentication",
|
|
38
50
|
"authorization",
|
|
39
51
|
"permission",
|
|
40
|
-
"
|
|
41
|
-
]
|
|
42
|
-
"publishConfig": {
|
|
43
|
-
"access": "public"
|
|
44
|
-
}
|
|
52
|
+
"role"
|
|
53
|
+
]
|
|
45
54
|
}
|
package/README.md
DELETED
|
@@ -1,151 +0,0 @@
|
|
|
1
|
-
# @lytjs/plugin-auth
|
|
2
|
-
|
|
3
|
-
> Lyt.js 认证授权插件 - 提供登录、权限校验、路由守卫等认证功能
|
|
4
|
-
|
|
5
|
-
**版本:** 4.2.0
|
|
6
|
-
|
|
7
|
-
## 安装
|
|
8
|
-
|
|
9
|
-
```bash
|
|
10
|
-
npm install @lytjs/plugin-auth
|
|
11
|
-
```
|
|
12
|
-
|
|
13
|
-
## 使用
|
|
14
|
-
|
|
15
|
-
### 注册插件
|
|
16
|
-
|
|
17
|
-
```typescript
|
|
18
|
-
import { createApp } from '@lytjs/core'
|
|
19
|
-
import { createAuth } from '@lytjs/plugin-auth'
|
|
20
|
-
|
|
21
|
-
const auth = createAuth({
|
|
22
|
-
loginUrl: '/api/login',
|
|
23
|
-
logoutUrl: '/api/logout',
|
|
24
|
-
userUrl: '/api/user',
|
|
25
|
-
tokenKey: 'lyt_token',
|
|
26
|
-
autoRedirect: true,
|
|
27
|
-
})
|
|
28
|
-
|
|
29
|
-
const app = createApp({})
|
|
30
|
-
app.use(auth)
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
### 登录与登出
|
|
34
|
-
|
|
35
|
-
```typescript
|
|
36
|
-
// 登录
|
|
37
|
-
const { user, token } = await auth.login({
|
|
38
|
-
username: 'admin',
|
|
39
|
-
password: '123456',
|
|
40
|
-
})
|
|
41
|
-
|
|
42
|
-
// 登出
|
|
43
|
-
await auth.logout()
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
### 注册
|
|
47
|
-
|
|
48
|
-
```typescript
|
|
49
|
-
const result = await auth.register({
|
|
50
|
-
username: 'newuser',
|
|
51
|
-
password: '123456',
|
|
52
|
-
email: 'user@example.com',
|
|
53
|
-
})
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
### 路由守卫
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
import { createRouter } from '@lytjs/router'
|
|
60
|
-
|
|
61
|
-
const router = createRouter({ /* ... */ })
|
|
62
|
-
auth.setupRouterGuard(router)
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
### 在组件中使用
|
|
66
|
-
|
|
67
|
-
通过 `app.provide('auth', auth)` 注入后,可在组件中通过 `inject('auth')` 获取认证实例。
|
|
68
|
-
|
|
69
|
-
```typescript
|
|
70
|
-
import { inject } from '@lytjs/core'
|
|
71
|
-
|
|
72
|
-
const auth = inject('auth')
|
|
73
|
-
|
|
74
|
-
// 检查登录状态
|
|
75
|
-
console.log(auth.isAuthenticated) // boolean
|
|
76
|
-
|
|
77
|
-
// 获取当前用户
|
|
78
|
-
console.log(auth.user) // AuthUser | null
|
|
79
|
-
|
|
80
|
-
// 获取 token
|
|
81
|
-
console.log(auth.token) // string | null
|
|
82
|
-
|
|
83
|
-
// 角色检查
|
|
84
|
-
auth.hasRole('admin') // boolean
|
|
85
|
-
|
|
86
|
-
// 权限检查
|
|
87
|
-
auth.hasPermission('write') // boolean
|
|
88
|
-
```
|
|
89
|
-
|
|
90
|
-
## API
|
|
91
|
-
|
|
92
|
-
### Options
|
|
93
|
-
|
|
94
|
-
| 选项 | 类型 | 默认值 | 描述 |
|
|
95
|
-
|------|------|--------|------|
|
|
96
|
-
| `loginUrl` | `string` | **必填** | 登录接口地址 |
|
|
97
|
-
| `logoutUrl` | `string` | - | 登出接口地址 |
|
|
98
|
-
| `userUrl` | `string` | - | 获取当前用户信息接口地址 |
|
|
99
|
-
| `registerUrl` | `string` | - | 注册接口地址 |
|
|
100
|
-
| `refreshTokenUrl` | `string` | - | Token 刷新接口地址 |
|
|
101
|
-
| `tokenKey` | `string` | `'lyt_token'` | localStorage 中存储 token 的 key |
|
|
102
|
-
| `autoRedirect` | `boolean` | `false` | 未登录时是否自动跳转到登录页 |
|
|
103
|
-
| `loginRoute` | `string` | `'/login'` | 登录页路由路径 |
|
|
104
|
-
| `homeRoute` | `string` | `'/'` | 登录后跳转的路由路径 |
|
|
105
|
-
| `onLoginSuccess` | `(user: any) => void` | - | 登录成功回调 |
|
|
106
|
-
| `onLoginError` | `(error: Error) => void` | - | 登录失败回调 |
|
|
107
|
-
| `onLogout` | `() => void` | - | 登出回调 |
|
|
108
|
-
| `onUnauthorized` | `() => void` | - | 未授权回调(401 等) |
|
|
109
|
-
| `onTokenRefreshed` | `(newToken: string) => void` | - | Token 刷新成功回调 |
|
|
110
|
-
| `onTokenRefreshError` | `(error: Error) => void` | - | Token 刷新失败回调 |
|
|
111
|
-
|
|
112
|
-
### 属性
|
|
113
|
-
|
|
114
|
-
| 属性 | 类型 | 描述 |
|
|
115
|
-
|------|------|------|
|
|
116
|
-
| `user` | `AuthUser \| null` | 当前用户信息 |
|
|
117
|
-
| `isAuthenticated` | `boolean` | 是否已认证 |
|
|
118
|
-
| `token` | `string \| null` | 当前 token |
|
|
119
|
-
| `loading` | `boolean` | 是否正在加载中 |
|
|
120
|
-
|
|
121
|
-
### 方法
|
|
122
|
-
|
|
123
|
-
| 方法 | 签名 | 描述 |
|
|
124
|
-
|------|------|------|
|
|
125
|
-
| `login` | `(credentials: Record<string, unknown>) => Promise<AuthUser>` | 登录,支持多种响应格式自动提取 token |
|
|
126
|
-
| `logout` | `() => Promise<void>` | 登出,清除本地认证状态 |
|
|
127
|
-
| `register` | `(data: Record<string, unknown>) => Promise<AuthUser>` | 注册新用户 |
|
|
128
|
-
| `fetchUser` | `() => Promise<AuthUser>` | 获取当前用户信息 |
|
|
129
|
-
| `getToken` | `() => string \| null` | 获取当前 token |
|
|
130
|
-
| `setToken` | `(token: string) => void` | 设置 token(内存 + localStorage) |
|
|
131
|
-
| `removeToken` | `() => void` | 移除 token(内存 + localStorage) |
|
|
132
|
-
| `hasRole` | `(role: string) => boolean` | 检查用户是否拥有指定角色 |
|
|
133
|
-
| `hasPermission` | `(perm: string) => boolean` | 检查用户是否拥有指定权限 |
|
|
134
|
-
| `refreshToken` | `() => Promise<string \| null>` | 刷新 Token |
|
|
135
|
-
| `setupRouterGuard` | `(router: Record<string, unknown>) => void` | 设置路由守卫,自动检查登录状态 |
|
|
136
|
-
|
|
137
|
-
### 类型
|
|
138
|
-
|
|
139
|
-
```typescript
|
|
140
|
-
interface AuthUser {
|
|
141
|
-
id: string | number
|
|
142
|
-
name: string
|
|
143
|
-
email?: string
|
|
144
|
-
role?: string
|
|
145
|
-
[key: string]: unknown
|
|
146
|
-
}
|
|
147
|
-
```
|
|
148
|
-
|
|
149
|
-
## License
|
|
150
|
-
|
|
151
|
-
MIT
|
package/dist/types/index.d.ts
DELETED
|
@@ -1,90 +0,0 @@
|
|
|
1
|
-
/** 认证配置选项 */
|
|
2
|
-
interface AuthOptions {
|
|
3
|
-
/** 登录接口地址 */
|
|
4
|
-
loginUrl: string;
|
|
5
|
-
/** 登出接口地址 */
|
|
6
|
-
logoutUrl?: string;
|
|
7
|
-
/** 获取当前用户信息接口地址 */
|
|
8
|
-
userUrl?: string;
|
|
9
|
-
/** 注册接口地址 */
|
|
10
|
-
registerUrl?: string;
|
|
11
|
-
/** Token 刷新接口地址 */
|
|
12
|
-
refreshTokenUrl?: string;
|
|
13
|
-
/** localStorage 中存储 token 的 key,默认 'lyt_token' */
|
|
14
|
-
tokenKey?: string;
|
|
15
|
-
/** 未登录时是否自动跳转到登录页 */
|
|
16
|
-
autoRedirect?: boolean;
|
|
17
|
-
/** 登录页路由路径 */
|
|
18
|
-
loginRoute?: string;
|
|
19
|
-
/** 登录后跳转的路由路径 */
|
|
20
|
-
homeRoute?: string;
|
|
21
|
-
/** 登录成功回调 */
|
|
22
|
-
onLoginSuccess?: (user: any) => void;
|
|
23
|
-
/** 登录失败回调 */
|
|
24
|
-
onLoginError?: (error: Error) => void;
|
|
25
|
-
/** 登出回调 */
|
|
26
|
-
onLogout?: () => void;
|
|
27
|
-
/** 未授权回调(401 等) */
|
|
28
|
-
onUnauthorized?: () => void;
|
|
29
|
-
/** Token 刷新成功回调 */
|
|
30
|
-
onTokenRefreshed?: (newToken: string) => void;
|
|
31
|
-
/** Token 刷新失败回调 */
|
|
32
|
-
onTokenRefreshError?: (error: Error) => void;
|
|
33
|
-
}
|
|
34
|
-
/** 认证插件应用接口(最小化) */
|
|
35
|
-
interface AuthPluginApp {
|
|
36
|
-
use(plugin: unknown, options?: unknown): void;
|
|
37
|
-
[key: string]: unknown;
|
|
38
|
-
}
|
|
39
|
-
/** 认证用户信息 */
|
|
40
|
-
interface AuthUser {
|
|
41
|
-
id: string | number;
|
|
42
|
-
name: string;
|
|
43
|
-
email?: string;
|
|
44
|
-
role?: string;
|
|
45
|
-
[key: string]: unknown;
|
|
46
|
-
}
|
|
47
|
-
/** 认证插件实例 */
|
|
48
|
-
interface Auth {
|
|
49
|
-
/** 安装到 Lyt 应用 */
|
|
50
|
-
install: (app: AuthPluginApp, options?: AuthOptions) => void;
|
|
51
|
-
/** 当前用户信息 */
|
|
52
|
-
user: AuthUser | null;
|
|
53
|
-
/** 是否已认证 */
|
|
54
|
-
isAuthenticated: boolean;
|
|
55
|
-
/** 当前 token */
|
|
56
|
-
token: string | null;
|
|
57
|
-
/** 是否正在加载中 */
|
|
58
|
-
loading: boolean;
|
|
59
|
-
/** 登录 */
|
|
60
|
-
login(credentials: Record<string, unknown>): Promise<AuthUser>;
|
|
61
|
-
/** 登出 */
|
|
62
|
-
logout(): Promise<void>;
|
|
63
|
-
/** 注册 */
|
|
64
|
-
register(data: Record<string, unknown>): Promise<AuthUser>;
|
|
65
|
-
/** 获取当前用户信息 */
|
|
66
|
-
fetchUser(): Promise<AuthUser>;
|
|
67
|
-
/** 获取 token */
|
|
68
|
-
getToken(): string | null;
|
|
69
|
-
/** 设置 token */
|
|
70
|
-
setToken(token: string): void;
|
|
71
|
-
/** 移除 token */
|
|
72
|
-
removeToken(): void;
|
|
73
|
-
/** 检查用户是否拥有指定角色 */
|
|
74
|
-
hasRole(role: string): boolean;
|
|
75
|
-
/** 检查用户是否拥有指定权限 */
|
|
76
|
-
hasPermission(perm: string): boolean;
|
|
77
|
-
/** 刷新 Token */
|
|
78
|
-
refreshToken(): Promise<string | null>;
|
|
79
|
-
/** 设置路由守卫,自动检查登录状态 */
|
|
80
|
-
setupRouterGuard(router: Record<string, unknown>): void;
|
|
81
|
-
}
|
|
82
|
-
/**
|
|
83
|
-
* 创建认证授权插件实例
|
|
84
|
-
* @param options 认证配置
|
|
85
|
-
* @returns Auth 插件实例
|
|
86
|
-
*/
|
|
87
|
-
declare function createAuth(options: AuthOptions): Auth;
|
|
88
|
-
export { createAuth };
|
|
89
|
-
export type { Auth, AuthOptions };
|
|
90
|
-
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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"}
|