Manifest会话管理:安全处理用户会话

Manifest会话管理:安全处理用户会话

【免费下载链接】manifest Effortless backends ✨ 【免费下载链接】manifest 项目地址: https://gitcode.com/GitHub_Trending/manifest7/manifest

你是否曾为用户会话的安全管理而烦恼?在Web应用开发中,会话管理是保障用户数据安全的关键环节。Manifest框架通过模块化设计,提供了一套完整的会话管理解决方案,从用户认证到会话维护,再到安全登出,全方位保护用户会话安全。本文将深入解析Manifest会话管理的实现机制,帮助你轻松掌握安全处理用户会话的方法。

会话管理核心架构

Manifest的会话管理基于前后端分离架构,前端负责会话状态维护,后端处理认证逻辑与令牌生成。核心组件包括认证服务、令牌管理、会话验证三大模块,形成完整的安全闭环。

认证实体设计

会话管理的基础是用户认证实体,Manifest通过AuthenticableEntity接口定义了可认证实体的标准结构,要求包含唯一邮箱和密码字段用于身份验证。

/**
 * The AuthenticableEntity interface is a BaseEntity with an unique email and a password 
 * (used for admins, users and everyone that needs to be authenticated).
 */
export interface AuthenticableEntity extends BaseEntity {
  /** The entity's unique email. It is used for authentication. */
  email: string;
  
  /** The entity's password. It is used for authentication. */
  password: string;
}

—— packages/core/types/src/crud/AuthenticableEntity.ts

前后端认证流程

Manifest采用JWT(JSON Web Token)实现无状态会话管理,认证流程如下:

  1. 用户提交登录凭证(邮箱/密码)
  2. 后端验证凭证并生成JWT令牌
  3. 前端存储令牌并在后续请求中携带
  4. 后端验证令牌有效性并授权访问

登录流程图

后端认证实现

后端认证核心逻辑位于AuthServiceAuthController中,负责令牌的生成、验证及用户信息获取。

令牌生成与验证

AuthService提供了createToken方法处理用户登录请求,通过SHA3算法加密密码后与数据库存储值比对,验证成功则生成JWT令牌。

async createToken(
  entitySlug: string,
  signupUserDto: SignupAuthenticableEntityDto
): Promise<{ token: string }> {
  const entityRepository: Repository<AuthenticableEntity> =
    this.entityService.getEntityRepository({ entitySlug }) as Repository<AuthenticableEntity>;

  const user = await entityRepository.findOne({
    where: {
      email: signupUserDto.email,
      password: SHA3(signupUserDto.password).toString()
    }
  });
  
  if (!user) {
    throw new HttpException('Invalid email or password', HttpStatus.UNAUTHORIZED);
  }
  
  return {
    token: jwt.sign(
      { email: signupUserDto.email },
      this.configService.get('TOKEN_SECRET_KEY')
    )
  };
}

—— packages/core/manifest/src/auth/auth.service.ts

认证接口设计

AuthController暴露了登录和获取当前用户信息的API端点,分别处理用户认证和会话验证请求。

@Controller('auth')
export class AuthController {
  constructor(private readonly authService: AuthService) {}

  @Post(':authenticableEntity/login')
  public async getToken(
    @Param('authenticableEntity') authenticableEntity: string,
    @Body() signupUserDto: SignupAuthenticableEntityDto
  ): Promise<{ token: string }> {
    return this.authService.createToken(authenticableEntity, signupUserDto);
  }

  @Get(':authenticableEntity/me')
  public async getCurrentUser(
    @Param('authenticableEntity') authenticableEntity: string,
    @Req() req: Request
  ): Promise<AuthenticableEntity> {
    return this.authService.getUserFromToken(
      req.headers?.authorization,
      authenticableEntity
    );
  }
}

—— packages/core/manifest/src/auth/auth.controller.ts

前端会话管理

前端会话管理由Angular的AuthService实现,负责令牌存储、登录状态维护及用户信息获取,与后端API紧密协作确保会话安全。

令牌存储与管理

前端使用localStorage存储JWT令牌,通过login方法处理登录请求,成功后保存令牌;logout方法清除令牌并重置会话状态。

async login(credentials: { email: string; password: string }): Promise<string> {
  return (firstValueFrom(
    this.http.post(`${environment.apiBaseUrl}/auth/admins/login`, credentials)
  ) as Promise<{ token: string }>).then((res: { token: string }) => {
    const token = res?.token;
    if (token) {
      localStorage.setItem(TOKEN_KEY, token);
    }
    return token;
  });
}

logout(): void {
  delete this.currentUserPromise;
  localStorage.removeItem(TOKEN_KEY);
}

—— packages/core/admin/src/app/modules/auth/auth.service.ts

登录组件实现

登录页面组件LoginComponent提供用户界面,通过表单收集用户凭证并调用AuthService的登录方法。

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})
export class LoginComponent implements OnInit {
  form: FormGroup;
  
  constructor(
    private fb: FormBuilder,
    private router: Router,
    private readonly authService: AuthService,
    private flashMessageService: FlashMessageService
  ) {
    this.form = this.fb.group({
      email: ['', [Validators.required, Validators.email]],
      password: ['', [Validators.required]]
    });
  }

  async submit(): Promise<void> {
    if (this.form.invalid) return;
    
    try {
      await this.authService.login(this.form.value);
      this.router.navigate(['/']);
    } catch (error) {
      this.flashMessageService.error('Invalid email or password');
    }
  }
}

—— packages/core/admin/src/app/modules/auth/views/login/login.component.ts

安全最佳实践

Manifest会话管理实现了多项安全措施,有效防范常见的会话安全风险,保障用户数据安全。

密码加密存储

后端使用SHA3算法对密码进行加密存储,避免明文密码泄露风险。加密过程在用户认证时实时进行,确保密码不会以明文形式在系统中传输或存储。

// 密码加密示例
password: SHA3(signupUserDto.password).toString()

—— packages/core/manifest/src/auth/auth.service.ts

令牌验证机制

每个请求都需携带有效的JWT令牌,后端通过getUserFromToken方法验证令牌有效性,确保只有授权用户能访问受保护资源。

getUserFromToken(
  token: string,
  entitySlug?: string
): Promise<AuthenticableEntity> {
  let decoded: jwt.JwtPayload;
  try {
    decoded = jwt.verify(
      token?.replace('Bearer ', ''),
      this.configService.get('TOKEN_SECRET_KEY')
    ) as jwt.JwtPayload;
  } catch (e) {
    return null;
  }
  
  // 令牌验证通过后查询用户信息
  const entityRepository: Repository<AuthenticableEntity> =
    this.entityService.getEntityRepository({ entitySlug }) as Repository<AuthenticableEntity>;

  return entityRepository.findOne({
    where: { email: decoded.email }
  });
}

—— packages/core/manifest/src/auth/auth.service.ts

会话状态维护

前端通过isLoggedIn方法检查用户登录状态,并在用户菜单组件中显示当前登录用户信息,提供直观的会话状态反馈。

isLoggedIn(): boolean {
  return !!localStorage.getItem(TOKEN_KEY);
}

// 用户信息显示
async ngOnInit(): Promise<void> {
  this.authService.me().then((admin: Admin) => {
    this.admin = admin;
  });
}

—— packages/core/admin/src/app/modules/auth/auth.service.ts & packages/core/admin/src/app/modules/layout/user-menu-item/user-menu-item.component.ts

总结与扩展

Manifest提供了一套完整的会话管理解决方案,从后端认证逻辑到前端状态维护,全方位保障用户会话安全。核心优势包括:

  1. 模块化设计:认证服务与业务逻辑分离,便于扩展和维护
  2. 安全加密:采用SHA3密码加密和JWT令牌认证,多重保障用户数据安全
  3. 前后端协同:前端状态管理与后端认证逻辑紧密配合,实现无缝会话体验

如需进一步扩展会话管理功能,可参考以下方向:

  • 实现令牌过期刷新机制,延长用户会话有效期
  • 添加多因素认证,提升账户安全性
  • 集成第三方登录,支持社交账号快捷登录

通过Manifest的会话管理机制,开发者可以轻松构建安全可靠的用户认证系统,专注于业务逻辑实现,无需重复开发基础安全功能。

【免费下载链接】manifest Effortless backends ✨ 【免费下载链接】manifest 项目地址: https://gitcode.com/GitHub_Trending/manifest7/manifest

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值