Manifest会话管理:安全处理用户会话
【免费下载链接】manifest Effortless backends ✨ 项目地址: 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)实现无状态会话管理,认证流程如下:
- 用户提交登录凭证(邮箱/密码)
- 后端验证凭证并生成JWT令牌
- 前端存储令牌并在后续请求中携带
- 后端验证令牌有效性并授权访问
后端认证实现
后端认证核心逻辑位于AuthService和AuthController中,负责令牌的生成、验证及用户信息获取。
令牌生成与验证
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提供了一套完整的会话管理解决方案,从后端认证逻辑到前端状态维护,全方位保障用户会话安全。核心优势包括:
- 模块化设计:认证服务与业务逻辑分离,便于扩展和维护
- 安全加密:采用SHA3密码加密和JWT令牌认证,多重保障用户数据安全
- 前后端协同:前端状态管理与后端认证逻辑紧密配合,实现无缝会话体验
如需进一步扩展会话管理功能,可参考以下方向:
- 实现令牌过期刷新机制,延长用户会话有效期
- 添加多因素认证,提升账户安全性
- 集成第三方登录,支持社交账号快捷登录
通过Manifest的会话管理机制,开发者可以轻松构建安全可靠的用户认证系统,专注于业务逻辑实现,无需重复开发基础安全功能。
【免费下载链接】manifest Effortless backends ✨ 项目地址: https://gitcode.com/GitHub_Trending/manifest7/manifest
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



