@buession/shiro
Version:
A security framework for JavaScript or TypeScript.
246 lines (237 loc) • 7.85 kB
JavaScript
/*!
* 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