从 canActivate 方法返回一个 Observable<boolean> 并在 false 时重定向
Returning an Observable<boolean> from canActivate method and redirect on false
我一直在寻找解决方案,但没有成功。如果用户获得授权,我需要调用服务器,并且我需要 canActivate 方法来等待该调用的结果。但我似乎无法将各个部分拼凑起来。下面是我的代码,我的问题在代码的注释中。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let user: EUser = new EUser();
user.sessionId = localStorage.getItem("sessionId");
//I am not sure how to implement this part.
// I need to recieve the response and get user.isAuthorized value and return it
// as an observable.
this.authenticationService.isAuthorized(user).subscribe((user)=>{
//Here i need to get user.isAuthorized and
//if the value is false, i need to navigate to login with this.router.navigate['login'] and return it.
//if the values it true, i need the code continue as it is.
});
}
身份验证服务
isAuthorized(user:EUser){
return this.http.post(ConnectionHelper.SERVER_URL+
ConnectionHelper.USER+ConnectionHelper.ISAUTHORIZED,user).map(res => res.json());
}
您的方法是正确的,您只需要将服务器响应映射到一个 bool
值。例如:
export interface AuthState {
username:string;
sessionId:string;
isAuthorized:boolean;
}
isAuthorized(user:EUser): Observable<AuthState> {
return this.http.post(ConnectionHelper.SERVER_URL+
ConnectionHelper.USER+ConnectionHelper.ISAUTHORIZED,user)
.map(res => res.json());
}
// Inject Router instance in the constructor of the guard class
// import required rxjs operators
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let user: EUser = new EUser();
user.sessionId = localStorage.getItem("sessionId");
return this.authenticationService.isAuthorized(user)
.map(user => user.isAuthorized)
.do(auth => {
if(!auth){
this.router.navigate(['/login']);
}
});
}
您可以再次使用 promise 和 return value 在 canActivate 中使用。
如果假设 isAuthorized
return boolean
值,您可以使用此代码:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let user: EUser = new EUser();
user.sessionId = localStorage.getItem("sessionId");
return this.authenticationService.isAuthorized(user)
.toPromise()
.then((isValidUser) => {
if (!isValidUser) {
this.router.navigate['login'];
}
return isValidUser;
});
}
请注意,then
链 return Promise
再次 return isValidUser
可在下一个 then
调用中访问。
我使用这个模式并且它对我有用。
我一直在寻找解决方案,但没有成功。如果用户获得授权,我需要调用服务器,并且我需要 canActivate 方法来等待该调用的结果。但我似乎无法将各个部分拼凑起来。下面是我的代码,我的问题在代码的注释中。
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let user: EUser = new EUser();
user.sessionId = localStorage.getItem("sessionId");
//I am not sure how to implement this part.
// I need to recieve the response and get user.isAuthorized value and return it
// as an observable.
this.authenticationService.isAuthorized(user).subscribe((user)=>{
//Here i need to get user.isAuthorized and
//if the value is false, i need to navigate to login with this.router.navigate['login'] and return it.
//if the values it true, i need the code continue as it is.
});
}
身份验证服务
isAuthorized(user:EUser){
return this.http.post(ConnectionHelper.SERVER_URL+
ConnectionHelper.USER+ConnectionHelper.ISAUTHORIZED,user).map(res => res.json());
}
您的方法是正确的,您只需要将服务器响应映射到一个 bool
值。例如:
export interface AuthState {
username:string;
sessionId:string;
isAuthorized:boolean;
}
isAuthorized(user:EUser): Observable<AuthState> {
return this.http.post(ConnectionHelper.SERVER_URL+
ConnectionHelper.USER+ConnectionHelper.ISAUTHORIZED,user)
.map(res => res.json());
}
// Inject Router instance in the constructor of the guard class
// import required rxjs operators
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let user: EUser = new EUser();
user.sessionId = localStorage.getItem("sessionId");
return this.authenticationService.isAuthorized(user)
.map(user => user.isAuthorized)
.do(auth => {
if(!auth){
this.router.navigate(['/login']);
}
});
}
您可以再次使用 promise 和 return value 在 canActivate 中使用。
如果假设 isAuthorized
return boolean
值,您可以使用此代码:
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
let user: EUser = new EUser();
user.sessionId = localStorage.getItem("sessionId");
return this.authenticationService.isAuthorized(user)
.toPromise()
.then((isValidUser) => {
if (!isValidUser) {
this.router.navigate['login'];
}
return isValidUser;
});
}
请注意,then
链 return Promise
再次 return isValidUser
可在下一个 then
调用中访问。
我使用这个模式并且它对我有用。