Security

权限策略

Malagu 框架提供了一套权限策略机制,让您可以更加灵活地定义权限策略。

策略(Policy)是对权限的描述,策略语法可以是任意形式,只要有对应的策略解释器来解释就好。策略可以分配给授信主体,也可以分配给资源。当然,也可以根据业务需要将策略分配给角色,角色可以再分配给某个用户,这样用户就拥有了角色的策略,换而言之,用户拥有了角色的权限。

云平台的策略

企业可以在云平台上创建很多资源,企业如何安全的管理这些资源,这就是云平台的策略需要考虑的问题,云平台的策略是这样来描述权限:在什么条件下能对哪些资源的哪些操作进行处理。

在 Malagu 框架中可以很方便地实现这样的效果,您只需要定义一个策略语法来表达:在什么条件下能对哪些资源的哪些操作进行处理。然后在实现一个对应的策略解释器即可。

如果您不需要定义像云平台那样复杂的策略,您完全可以更加您自己的业务需要定义您自己的策略语法。

默认策略

Malagu 框架提供给了一个默认策略:EL 表达式策略,当 EL 表达式计算结果为 true,表示允许,否则表示拒绝。用户可以在方法上通过相关的权限装饰器定义策略,也可以通过组件属性定义策略。

EL 表达式策略

Malagu 框架提供给了一个默认策略:EL 表达式策略,当 EL 表达式计算结果为 true,表示允许,否则表示拒绝。用户可以在方法上通过相关的权限装饰器配置策略,也可以通过组件属性配置策略。

定义

export interface Policy {
  type: PolicyType;
  authorizeType: AuthorizeType;
}

export interface ElPolicy extends Policy {
  context: any;
  el: string;
}

权限装饰器

为了用户方便地配置 EL 表达式策略,框架提供了一些列权限装饰器@Authorize@PreAuthorize@PostAuthorize@Anonymous@Authenticated

其中,@PreAuthorize@PostAuthorize@Anonymous@Authenticated是对@Authorize的扩展。

@Authorize

装饰器的配置属性:

export interface AuthorizeOption {
  el: string;
  authorizeType: AuthorizeType; // 授权类型包括前置授权和后置授权
}

@PreAuthorize

扩展 @Authorize  装饰器,等价于将  @Authorize  的 authorizeType  属性固定为前置授权。具体实现如下:

export const PreAuthorize = function (el: string) {
  return Authorize({ el, authorizeType: AuthorizeType.Pre });
};

@PostAuthorize

扩展 @Authorize 装饰器,等价于将 @AuthorizeauthorizeType 属性固定为后置授权。具体实现如下:

export const PostAuthorize = function (el: string) {
  return Authorize({ el, authorizeType: AuthorizeType.Post });
};

@Anonymous

扩展 @Authorize 装饰器,等价于将 @Authorize 的  el 属性固定为 true  和  authorizeType 属性固定为前置授权 。具体实现如下:

export const Anonymous = function (): any {
  return Authorize({ el: "true", authorizeType: AuthorizeType.Pre });
};

@Authenticated

扩展 @Authorize 装饰器,等价于将 @Authorizeel 属性固定为 authenticated  和 authorizeType 属性固定为前置授权 。具体实现如下:

export const Authenticated = function () {
  return Authorize({ el: "authenticated", authorizeType: AuthorizeType.Pre });
};

其中,authenticated是内置的 EL 上下文变量,当为 true 时,表示当前登录用户认证通过;当为 false 时,表认证失败。

EL 表达式上下文

我们往往需要一些变量或者方法参与到 EL 表达式的计算中,框架通过 EL 表达式上下文来提供这些变量或者方法,默认提供的 EL 表达式上下文如下:

export interface ElContext {
  authorizeType: AuthorizeType;
  method: string;
  args: any[];
  target: any;
  returnValue?: any;
  policies: Policy[];
  credentials: any;
  details?: any;
  principal: any;
  authenticated: boolean;
}

扩展 EL 表达式上下文

框架提供了一个扩展接口SecurityExpressionContextHandler用于扩展 EL 表达式上下文。

定义

export interface SecurityExpressionContextHandler {
  handle(context: any): Promise<void>;
}

实现

@Component(SecurityExpressionContextHandler)
export class SecurityExpressionContextHandlerImpl implements SecurityExpressionContextHandler {
    handle(context: any): Promise<void> {
            context.foo = 'bar';
        context.hasRole = () => { ... };
    }
}

Copyright © 2024 Zero (github@groupguanfang) 粤ICP备2023102563号