Функция, над которой я работаю, состоит в том, что система должна определять правильный тип пользователя и предоставлять соответствующие разрешения после успешного входа в систему, и я хотел использовать функцию гнезда RoleGuard JS.
Но я не могу понять, как на самом деле работает этот RoleGuard. И я не могу заставить его работать.
Я хотел, чтобы пользователь с указанными c правилами имел доступ к некоторым конечным точкам, как только пользователь с правами администратора разрешено получать весь список пользователей.
В чем, похоже, проблема? У кого-нибудь есть идея? Я предоставил фрагменты ниже. И после запроса я должен просто добавить роль в теле запроса? или было бы хорошо, если бы я получил текущего зарегистрированного пользователя и определил роль? Спасибо.
Вот мои пользовательские данные, которые играют роль:
"id": 11, {
"role": "admin",
"username": "myadmin@test.com",
"created": "2020-03-18T02:30:04.000Z",
"updated": "2020-03-18T03:02:12.000Z"
}
SampleCode
import { JwtAuthGuard } from '../../auth/jwt-auth.guard';
import { RolesGuard } from '../../common/guards/roles.guard';
import { Roles } from '../common/decorators/roles.decorator';
@Controller('user')
@UseGuards(JwtAuthGuard, RolesGuard)
export class UserController {
constructor(private readonly usersService: UsersService) {}
@Get()
@Roles('admin')
findAll(): Promise<UserEntity[]> {
return this.usersService.findAll();
}
RoleGuard
export class RolesGuard implements CanActivate {
constructor(private readonly reflector: Reflector) {}
canActivate(context: ExecutionContext): boolean {
const roles = this.reflector.get<string[]>('roles', context.getHandler());
console.log('roles:', roles);
if (!roles) {
return true;
}
const request = context.switchToHttp().getRequest();
const user = request.user;
const hasRole = () => user.roles.some(role => roles.indexOf(role) > -1);
console.log('hasRole', hasRole);
return user && user.roles && hasRole();
}
}