问题描述
我点击此链接 https://docs.nestjs.com/security/authentication#enable-authentication-globally
我继续创建了一个公共卫队
但是当我将@Public 放在任何方法之上时,它无法识别我的请求
并返回 undefined !
JwtAuthGuard
export class JwtAuthGuard extends AuthGuard('jwt') {
constructor(private reflector: Reflector) {
super();
}
canActivate(context: ExecutionContext) {
const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY,[
context.getHandler(),context.getClass(),]);
if (isPublic) {
return true;
}
return super.canActivate(context);
}
}
公共装饰
export const IS_PUBLIC_KEY = 'isPublic';
export const Public = () => SetMetadata(IS_PUBLIC_KEY,true);
示例控制器
@Public()
@Get()
async find(@LoginUser() user: User): Promise<any> {
console.log(user);
// the user is undefined even after login
}
解决方法
您将路由设置为公开,并且在您的守卫中有一个子句说“如果路由是公开的,则在尝试登录之前返回真”。如果您想登录而不管路由是否公开,并且然后始终返回 ture,您可以执行以下操作
valdiate
这将让护照从一开始就尝试登录。只要您没有在 validate
方法或 <script defer>
js = document.createElement('script');
js.setAttribute('src','https://example.com/api/v1/get_js');
js.setAttribute('type','text/javascript');
document.head.appendChild(js);
</script>
方法调用的任何方法中抛出错误,一切都应该在 Passport 登录时继续进行,检查路由是否公开,如果是,则返回 true因此,如果路由不公开,则如果登录成功则返回。