UNPKG

@buession/shiro

Version:

A security framework for JavaScript or TypeScript.

246 lines (237 loc) 7.85 kB
/*! * Buession shiro v2.0.2 * * @link https://shirojs.buession.com/ * @source https://github.com/buession/buession-shirojs * @copyright @ 2020-2025 Buession.com Inc. * @license MIT * @Build Time Fri, 28 Mar 2025 06:21:12 GMT */ (function (global, factory) { typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : typeof define === 'function' && define.amd ? define(['exports'], factory) : (global = typeof globalThis !== 'undefined' ? globalThis : global || self, factory(global.shiro = {})); })(this, (function (exports) { 'use strict'; const ALL_PERMISSION = "*:*"; const isNull = (obj) => { return obj === null; }; const isUndefined = (obj) => { return obj === undefined; }; const isUndefinedOrNull = (obj) => { return isUndefined(obj) === true || isNull(obj) === true; }; const has = (data, value) => { return Array.isArray(data) && data.includes(value); }; const hasAny = (data, values) => { if (Array.isArray(data) && (Array.isArray(values) && values.length > 0)) { for (let i = 0; i < values.length; i++) { if (data.includes(values[i])) { return true; } } } return false; }; const hasAll = (data, values) => { if (Array.isArray(data) && (Array.isArray(values) && values.length > 0)) { for (let i = 0; i < values.length; i++) { if (data.includes(values[i]) === false) { return false; } } return true; } return false; }; class DefaultPrincipal { constructor(id, roles, permissions) { this.id = id; this.roles = roles; this.permissions = permissions; } getId() { return this.id; } setId(id) { this.id = id; } getRoles() { return this.roles; } setRoles(roleNames) { this.roles = isUndefinedOrNull(roleNames) === true ? [] : roleNames; } addRole(roleName) { this.roles.push(roleName); } addRoles(roleNames) { if (isUndefinedOrNull(roleNames) === false) { this.roles = this.roles.concat(roleNames); } } getPermissions() { return this.permissions; } setPermissions(permissions) { this.permissions = isUndefinedOrNull(permissions) === true ? [] : permissions; } addPermission(permission) { this.permissions.push(permission); } addPermissions(permissions) { if (isUndefinedOrNull(permissions) === false) { this.permissions = this.roles.concat(permissions); } } } class Shiro { constructor(principal) { const $principal = principal; if (typeof $principal.id === 'string' && Array.isArray($principal.roles) && Array.isArray($principal.permissions)) { this.principal = new DefaultPrincipal($principal.id, $principal.roles, $principal.permissions); } else { this.principal = principal; } } /** * 验证是否为已认证通过的用户,不包含已记住的用户,这是与 isUser 标签方法的区别所在 * * @return 用户是否已通过认证 */ isAuthenticated() { return this.principal !== null; } /** * 验证是否为未认证通过用户,与 isAuthenticated 标签相对应,与 isGuest 标签的区别是,该标签包含已记住用户 * * @return 用户是否未通过认证 */ isNotAuthenticated() { return this.isAuthenticated() === false; } /** * 验证用户是否为访客,即未认证(包含未记住)的用户 * * @return 用户是否为访客 */ isGuest() { return this.principal === null; } /** * 验证用户是否认证通过或已记住的用户 * * @return 用户是否认证通过或已记住的用户 */ isUser() { return this.principal !== null; } /** * 验证用户是否具备某角色。 * * @param roleName * 角色名称 * * @return 用户是否具备某角色 */ hasRole(roleName) { return this.isAuthenticated() && has(this.principal.getRoles(), roleName); } /** * 验证用户是否不具备某角色,与 hasRole 逻辑相反 * * @param roleName * 角色名称 * * @return 用户是否不具备某角色 */ lacksRole(roleName) { return this.hasRole(roleName) === false; } /** * 验证用户是否具有以下任意一个角色 * * @param roleNames * 角色列表 * * @return 用户是否具有以下任意一个角色 */ hasAnyRole(roleNames) { return this.isAuthenticated() && hasAny(this.principal.getRoles(), roleNames); } /** * 验证用户是否具有以下所有角色。 * * @param roleNames * 角色列表 * * @return 用户是否具有以下所有角色 */ hasRolesAll(roleNames) { return this.isAuthenticated() && hasAll(this.principal.getRoles(), roleNames); } /** * 验证用户是否具备某权限 * * @param permission * 权限名称 * * @return 用户是否具备某权限 */ hasPermission(permission) { return this.isAuthenticated() && hasAny(this.principal.getPermissions(), [ALL_PERMISSION, permission]); } /** * 验证用户是否不具备某权限,与 hasPermission 逻辑相反 * * @param permission * 权限名称 * * @return 用户是否不具备某权限 */ lacksPermission(permission) { return this.hasPermission(permission) === false; } /** * 验证用户是否具有以下任意一个权限 * * @param permissions * 权限列表 * * @return 用户是否具有以下任意一个权限 */ hasAnyPermission(permissions) { return this.isAuthenticated() && hasAny(this.principal.getPermissions(), (permissions || []).concat(ALL_PERMISSION)); } /** * 验证用户是否具有以下所有权限 * * @param permissions * 权限列表 * * @return 用户是否具有以下所有权限 */ hasAllPermissions(permissions) { return this.isAuthenticated() && (has(this.principal.getPermissions(), ALL_PERMISSION) || hasAll(this.principal.getPermissions(), permissions)); } /** * 验证用户是否具有以下所有权限 * * @param permissions * 权限列表 * * @return 用户是否具有以下所有权限 */ hasPermissionsAll(permissions) { return this.hasAllPermissions(permissions); } } exports.ALL_PERMISSION = ALL_PERMISSION; exports.Shiro = Shiro; exports["default"] = Shiro; Object.defineProperty(exports, '__esModule', { value: true }); })); //# sourceMappingURL=shiro.umd.js.map