major update regarding many to many roles per user and their related impacts

This commit is contained in:
2025-01-10 19:31:55 +07:00
parent 9473c56619
commit 085cae47e1
6 changed files with 297 additions and 108 deletions

View File

@ -37,20 +37,22 @@ export class AuthController {
try {
const schema = Joi.object().keys({
username: Joi.string().max(64).required().label('Username'),
password: Joi.string().min(8).required().label('Password')
password: Joi.string().min(8).required().label('Password'),
application: Joi.string().required().label('Application'),
});
const param: User = await schema.validateAsync(req.body);
const param: User & { application: string } = await schema.validateAsync(req.body);
const userRepository = OrmHelper.DB.getRepository(User);
const userRefreshTokenRepository = OrmHelper.DB.getRepository(UserRefreshToken);
const user = await userRepository.findOne({
select: ['id', 'email', 'password', 'username', 'id_role'],
relations: ['roles', 'roles.application'],
select: ['id', 'email', 'password', 'username', 'roles'],
where: { username: param.username },
})
if (user != null && user.checkIfPasswordMatch(param.password)) {
if (user != null && user.roles != null && user.roles.length > 0 && user.checkIfPasswordMatch(param.password)) {
const { browser, device, os } = UAParser(req.get('User-Agent'));
@ -66,48 +68,67 @@ export class AuthController {
await userRefreshTokenRepository.save(refresh_token);
const userRoleRepository = OrmHelper.DB.getRepository(UserRole);
const userRole = await userRoleRepository.findOneBy({ id: user.id_role })
// const userRoleRepository = OrmHelper.DB.getRepository(UserRole);
var privateKey = fs.readFileSync('src/helpers/key/private.key');
let role_id = '';
let roles: UserRole;
var token = jwt.sign(
{
exp: Math.floor(Date.now() / 1000) + (Number(config.get('auth.access_token_lifetime'))),
data: {
id: user.id,
username: user.username,
id_role: user.id_role,
roles: userRole.roles
if (user.roles) {
for (let r of user.roles) {
if (r.application.id == param.application) {
role_id = r.id;
roles = r;
}
},
privateKey,
{ algorithm: 'RS256' }
);
delete user.password;
const data = {
user,
role_name: userRole.name,
roles_list: await AuthController.getListRole(userRole.roles),
token: {
access_token: token,
refresh_token: refresh_token.refresh_token
}
}
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_login, data);
if (role_id == '') {
return ReturnHelper.errorResponse(res, 403, 403, Language.lang.failed_access + ', you don\'t have any roles in this application');
} else {
// const userRole = await userRoleRepository.findOneBy({ id: role_id })
var privateKey = fs.readFileSync('src/helpers/key/private.key');
var token = jwt.sign(
{
exp: Math.floor(Date.now() / 1000) + (Number(config.get('auth.access_token_lifetime'))),
data: {
id: user.id,
username: user.username,
id_role: role_id,
roles: roles.roles
}
},
privateKey,
{ algorithm: 'RS256' }
);
delete user.password;
const data = {
user,
role_name: roles.name,
roles_list: await AuthController.getListRole(roles.roles),
token: {
access_token: token,
refresh_token: refresh_token.refresh_token
}
}
return ReturnHelper.successResponseAny(res, 200, Language.lang.success_login, data);
}
}
return ReturnHelper.errorResponse(res, 403, 401, Language.lang.failed_access);
if (user.roles == null || user.roles.length == 0) {
return ReturnHelper.errorResponse(res, 403, 401, Language.lang.failed_access + ', you don\t have any roles in this application');
} else {
return ReturnHelper.errorResponse(res, 403, 402, Language.lang.failed_access);
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed_access, err.message);
return ReturnHelper.errorResponse(res, 500, 403, Language.lang.failed_access, err.message);
}
}
@ -309,9 +330,10 @@ export class AuthController {
try {
const schema = Joi.object().keys({
refresh_token: Joi.string().uuid().required().label('Refresh Token'),
application: Joi.string().required().label('Application'),
});
const param: UserRefreshToken = await schema.validateAsync(req.params);
const param: UserRefreshToken & { application: string } = await schema.validateAsync(req.params);
const userRefreshTokenRepo = OrmHelper.DB.getRepository(UserRefreshToken);
@ -320,40 +342,59 @@ export class AuthController {
if (refresh_token != null) {
const userRepo = OrmHelper.DB.getRepository(User);
const user = await userRepo.findOneBy({ id: refresh_token.id_user });
const user = await userRepo.findOne({ relations: ['roles', 'roles.application'], where: { id: refresh_token.id_user } });
const userRoleRepository = OrmHelper.DB.getRepository(UserRole);
const userRole = await userRoleRepository.findOneBy({ id: user.id_role });
let role_id = '';
let roles: UserRole;
var privateKey = fs.readFileSync('src/helpers/key/private.key');
if (user.roles != null && user.roles.length > 0) {
for (let r of user.roles) {
if (r.application.id == param.application) {
role_id = r.id;
var token = jwt.sign(
{
exp: Math.floor(Date.now() / 1000) + (Number(config.get('auth.access_token_lifetime'))),
data: {
id: user.id,
username: user.username,
id_role: user.id_role,
roles: userRole.roles
roles = r;
}
},
privateKey,
{ algorithm: 'RS256' }
);
}
} else {
return ReturnHelper.errorResponse(res, 403, 401, Language.lang.failed_access + ', you don\'t have any roles in this application');
}
return ReturnHelper.successResponseAny(res, 200, Language.lang.success, {
token,
role_name: userRole.name,
roles_list: await AuthController.getListRole(userRole.roles)
});
// const userRoleRepository = OrmHelper.DB.getRepository(UserRole);
// const userRole = await userRoleRepository.findOneBy({ id: role_id });
if (roles) {
var privateKey = fs.readFileSync('src/helpers/key/private.key');
var token = jwt.sign(
{
exp: Math.floor(Date.now() / 1000) + (Number(config.get('auth.access_token_lifetime'))),
data: {
id: user.id,
username: user.username,
id_role: role_id,
roles: roles.roles
}
},
privateKey,
{ algorithm: 'RS256' }
);
return ReturnHelper.successResponseAny(res, 200, Language.lang.success, {
token,
role_name: roles.name,
roles_list: await AuthController.getListRole(roles.roles)
});
} else {
return ReturnHelper.errorResponse(res, 403, 402, Language.lang.failed_access + ', you don\'t have any roles in this application');
}
} else {
return ReturnHelper.errorResponse(res, 404, 401, Language.lang.failed, "");
return ReturnHelper.errorResponse(res, 404, 403, Language.lang.failed, "");
}
} catch (e: unknown) {
log.error(e);
const err = e as Error;
return ReturnHelper.errorResponse(res, 500, 402, Language.lang.failed, err.message);
return ReturnHelper.errorResponse(res, 500, 404, Language.lang.failed, err.message);
}
}