添加组件

  1. @malagu/security

默认配置

  1. malagu:
  2. security:
  3. enabled: true
  4. usernameKey: username
  5. passwordKey: password
  6. backend:
  7. malagu:
  8. security:
  9. contextKey: malagu:securityContext
  10. username: admin
  11. password: MzQ0NTg4ZTk2NzQyYWI1ODA1MDFlNDBjMzZhZDY4OWQ1Zjc5ZDYxYzc2MjQ1NWZk # raw password 123456
  12. passwordEncoder:
  13. secret: 123456
  14. encodeHashAsBase64: true
  15. basic:
  16. realm: realm
  17. loginPage: /login
  18. loginUrl: /login
  19. loginMethod: POST
  20. loginSuccessUrl: /
  21. logoutUrl: /logout
  22. logoutMethod: POST
  23. logoutSuccessUrl: /login

实现登录页面

在登录页面中,通过 POST 请求提交用户名(username)和密码(password)到 /login ,将会触发框架的认证流程,默认提供的用户名为:admin,密码为:123456,当然,您也可以实现 UserStore 接口提供您自己用户信息。当用户名和密码都匹配成功后,则认证成功,跳转到登录成功页面,默认是 / ,否则认证失败,跳转到登录页面 /login

自定义 UserStore

您可以通过查询数据库获取用户信息,以下为框架默认实现,返回固定的用户信息:

  1. @Component(UserStore)
  2. export class UserStoreImpl implements UserStore {
  3. @Value('malagu.security')
  4. protected readonly options: any;
  5. async load(username: string): Promise<User> {
  6. if (this.options.username === username) {
  7. return {
  8. username,
  9. password: this.options.password,
  10. accountNonExpired: true,
  11. accountNonLocked: true,
  12. credentialsNonExpired: true,
  13. enabled: true,
  14. policies: [ <ElPolicy>{
  15. type: PolicyType.El,
  16. authorizeType: AuthorizeType.Pre,
  17. el: 'true'
  18. } ]
  19. };
  20. }
  21. throw new UsernameNotFoundError(`Could not find: ${username}`);
  22. }
  23. }

方法保护

默认对外的方法都会保护起来,当您没有登录通过 ajax 直接方法,将返回 401 状态码;当您没有登录通过浏览器访问页面,将返回 302 状态码,重定向到登录页面。

登录成功后,当您有权限访问该方法,则访问成功,当您没有权限访问该方法,则访问失败,返回 403 状态码。

匿名访问

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

  1. @Get()
  2. @Anonymous()
  3. @Transactional({ readOnly: true })
  4. list(): Promise<User[]> {
  5. const repo = OrmContext.getRepository(User);
  6. return repo.find();
  7. }


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

  1. @Controller('users')
  2. @Anonymous()
  3. export class UserController {
  4. ...
  5. }

授权

任何方法或者页面都需要显示授权才能访问,单单认证通过是不够的,可以授权给用户访问某些方法的权限,也可以授权给方法,允许哪类用户可以访问。框架会更加这些权限信息做权限验证,验证通过了才可以访问具体的方法和页面,后面会做详细的展开