首先对不起标题,我不知道该怎么称呼它。
我正在开发一个项目,需要一个我最初工作得很好的身份验证防护。基本上它所做的就是检查本地存储中是否存在有效令牌。很简单。
正如大多数应用程序所做的那样,它需要在用户配置文件上设置“重置密码”标志,这会迫使他们在下次登录时重置密码,这样会有点复杂。这就是警卫停止按预期工作的地方。我认为# with
with(evaluate(a), b + c + d)
[1] 18
# unlist the unnamed output object
sum(unlist(evaluate(a)))
[1] 18
# subset a named output object
result <- evaluate(a)
result$b + result$c + result$d
[1] 18
# subset an unnamed output object
evaluate(a)$b + evaluate(a)$c + evaluate(a)$d
[1] 18
# custom function with fancy arguments
f <- function(...) {
args <- unlist(...)
sum(args)
}
f(evaluate(a))
[1] 18
并没有完全构成链,因为当守卫运行控制台日志result[["b"]] + result[["c"]] + result[["d"]]
[1] 18
时,却无法让用户继续。我对RxJs不太熟悉,知道需要做什么。我也提前为可观察到的厄运金字塔道歉。重构这是“很棒的事情”列表。
return Observable.of(true)
任何建议都会非常感谢...谢谢
答案 0 :(得分:2)
我最终搞清楚了。我开始将大多数观察者合并为一个电话。我还有一个嵌套的observable。但我也发现你必须注意你的回归类型。在switchMap中我返回Observables,但是在嵌套的map操作中它会切换到boolean。
@Injectable()
export class AuthenticationGuard implements OnInit, CanActivate {
systemSetting$: Observable<any> = this._SystemSettingsService.getSystemSetting('AUTHENTICATION');
localUserObject$: Observable<LocalUserObject> = this._LocalUserService.getLocalUserObject();
initialData = Observable.zip(
this.systemSetting$,
this.localUserObject$
);
constructor(
private _Router: Router,
private _LocalUserService: LocalUserService,
private _SystemSettingsService: SystemSettingsService,
private _UsersService: UsersService
) { }
ngOnInit() {
}
canActivate(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<boolean> {
return this.initialData.switchMap(_Result => {
// Check for Authentication to be Enabled
if (_Result[0].data.settingValue.enabled) {
// Check if Local User Object is Empty and if a Token is Present
if (_Result[1] && _Result[1].token) {
return this._UsersService.getUser(_Result[1].userID)
.map(_User => {
// If password reset is enabled, force user to reset their password.
if (_User.data.userPasswordReset) {
this._Router.navigate(['/gateway/password-reset']);
return false;
// If password reset is false, allow the user to proceed.
} else {
console.log('PASSWORD RESET, PROCEED');
return true;
}
})
// If Local User Object is invalid, navigate to Login Page.
} else {
// not logged in so redirect to login page with the return url
this._Router.navigate(['/gateway/login'], { queryParams: { returnUrl: state.url } });
return Observable.of(false);
}
// If Authentication is disabled allow the user to bypass authentication
} else {
return Observable.of(true);
}
})
}
}