我的路由应该是AuthenticatedRouteMixin
或UnauthenticatedRouteMixin
,具体取决于从服务器返回的响应。我该如何实现呢?
目前,我有一个AuthenticatedRouteMixin
的路由,我通过覆盖我的beforeModel并执行willTransition操作强制对路由进行身份验证和解除身份验证,如下所示。
beforeModel() {
this.set('session.isAuthenticated', true);
return this._super(...arguments);
}
和
actions: {
willTransition: function(){
if (Ember.isEmpty(_this.get('session.data.authenticated.token')))
{
this.set('session.isAuthenticated', false);
}
}
}
然而,这有两个问题。
对此有一些意想不到的后果。如果未登录然后尝试登录,则用户需要在重定向到相应页面之前刷新页面。我查看了simple-auth代码,并且transitionTo函数没有按预期运行。
sessionAuthenticated() {
const attemptedTransition = this.get('session.attemptedTransition');
if (attemptedTransition) {
attemptedTransition.retry();
this.set('session.attemptedTransition', null);
} else {
this.transitionTo(Configuration.routeAfterAuthentication);
}
}
this.transitionTo(Configuration.routeAfterAuthentication);
是未转换的行。我已经确认Configuration.routeAfterAuthentication
设置正确。
我可能会强制重新加载登录路线或用户导航到的路线,但(我认为)由于上面的问题2,我遇到无限重定向。
我很乐意做以下事情:
import AuthenticatedRouteMixin from 'ember-simple-auth/mixins/authenticated-route-mixin';
import UnauthenticatedRouteMixin from 'ember-simple-auth/mixins/unauthenticated-route-mixin';
const { service } = Ember.inject;
var mixin;
if (service('session').isAuthenticated){
mixin = AuthenticatedRouteMixin;
}
else{
mixin = UnauthenticatedRouteMixin;
}
export default Ember.Route.extend(mixin, { ... })
但是,我没有从会话中获取信息。我不确定,但是可能需要加载特定的Ember.Route
来获取该信息。
非常感谢任何帮助。
我可能会强制在登录路线重新加载或在路由用户的地方重新加载 导航到,但(我认为)由于上面的问题2,我正在运行 进入无限重定向。
我想出了这一部分。我只是在会话中设置了一个键/值。如果是,则重新加载并删除密钥或将其设置为false,因此重新加载仅发生一次。
答案 0 :(得分:0)
嗯,正确的方法是在您的路线中手动完成混音。查看source code.
不是那么难吗?有趣的是:为什么在会话通过时需要AuthenticatedRouteMixin
,而在会话未通过时UnauthenticatedRouteMixin
?这与你不包括任何混音时的行为基本相同。
因为AuthenticatedRouteMixin
仅在会话未经过身份验证时更改行为,并且UnauthenticatedRouteMixin
仅在路由经过身份验证时更改行为。
但是你的路线中有类似的东西是你要求的:
beforeModel(transition) {
if(...) {
if (!this.get('session.isAuthenticated')) {
transition.abort();
this.set('session.attemptedTransition', transition);
this.transitionTo(Configuration.authenticationRoute);
return;
}
} else {
if (this.get('session').get('isAuthenticated')) {
transition.abort();
this.transitionTo(Configuration.routeIfAlreadyAuthenticated);
return;
}
}
return this._super(...arguments);
},