认证与授权组件 ​@malagu/security​ 。Malagu 框架结合传统后台管理系统和云计算平台的认证与授权理念,并借鉴了 Spring Security 设计思想,抽象了一套通用的认证与授权模型。Spring Security 对前后端分离架构支持不是特别友好,Malagu 框架在这方面也做了不少改进。


框架提供的认证与授权默认实现比较简单,认证是基于用户名与密码方式;授权是授权装饰器 + EL 表达式。但是,框架提供了很多扩展点,基于这些扩展点,我们可以实现各种各样复杂的认证与授权实现,例如 ​@malagu/oauth2-client​ 组件是基于 @malagu/security 组件扩展实现,提供了基于 ODIC 的认证和 OAuth2.0 的授权能力。


使用方法


框架提供了一个开箱即用的组件 ​@malagu/security​ ,该组件提供了一套默认的行为规则,例如


大部分默认行为,我们无需自定义。有少量是需要我们根据业务情况自己实现的,比如登录页面、登录成功页面、登出成功页面,以及用户服务接口的实现(从数据库中加载用户信息)。安装 @malagu/security 组件如下:

yarn add @malagu/security # 或者 npm i @malagu/security


实现登录页面


在登录页面中,默认需要通过 POST 方法(可以自定义),并且携带用户名(username)和密码(password)信息发送请求到 /login ,该动作将触发认证流程。


默认提供的内置用户信息:用户名/密码为 admin/123456(我们也可以实现用户服务接口 ​UserService​ ,提供真实业务的用户信息)。在后端,当用户名和密码认证成功,则跳转到登录成功页面,默认登录成功页面路由是 / ,否则,跳转到登录页面 /login


接口与页面保护


当我们添加了该组件后,默认对外的接口方法和页面都会被保护起来(可以通过属性 ​malagu.security.enabled​ 全局关闭方法保护),需要登录以后才能访问接口方法。我们也可以给接口方法配置需要拥有什么样的权限才能访问,该组件默认提供了 ​@PreAuthorize​ 装饰器,定义接口方法需要什么样的权限才能够被访问。

@Get()
@PreAuthorize('hasRole("admin")')  // 表示当前登录的用户需要拥有管理员角色才可访问
@Transactional({ readOnly: true })
list(): Promise<User[]> {
  const repo = OrmContext.getRepository(User);
  return repo.find();
}


当没有登录的时候,通过 ajax 直接访问接口,将返回 401 状态码;通过浏览器访问页面,将返回 302 状态码,重定向到登录页面,登录成功后,又会重定向到最开始要访问的页面。


登录成功后,当我们有权限访问该方法或页面,则访问成功,否则,访问失败,返回 403 状态码。


匿名访问


方法上添加装饰器 @Anonymous ,可以让方法可以匿名访问。


@Get()
@Anonymous()
@Transactional({ readOnly: true })
list(): Promise<User[]> {
  const repo = OrmContext.getRepository(User);
    return repo.find();
}

 

也可以添加到类上,让类的所有方法可以里面访问。


@Controller('users')
@Anonymous()
export class UserController {
    ...
}