Ember 路由上的 simple-auth AuthenticatedRouteMixin 或 UnauthenticatedRouteMixin 取决于条件
Ember simple-auth AuthenticatedRouteMixin or UnauthenticatedRouteMixin on route depending on condition
我有一条路线应该是 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);
}
}
}
但是,这有两个问题。
- 看起来和感觉都不对。可能有更好的方法
这个。
这会产生一些意想不到的后果。如果未登录然后尝试登录,则用户需要在重定向到相应页面之前刷新页面。我查看了简单授权代码,发现 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
才能获取该信息。
如有任何帮助,我们将不胜感激。
更新
I may force a reload at the login route or where ever route a user
navigates to, but (I think) because of issue 2 above, I am running
into infinite redirects.
我想出了这部分。我只是在会话中设置了一个 key/value 。如果为 true,则重新加载并删除密钥或将其设置为 false,以便重新加载仅发生一次。
好吧,正确的方法是在您的路线中手动进行混音。查看 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);
},
我有一条路线应该是 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);
}
}
}
但是,这有两个问题。
- 看起来和感觉都不对。可能有更好的方法 这个。
这会产生一些意想不到的后果。如果未登录然后尝试登录,则用户需要在重定向到相应页面之前刷新页面。我查看了简单授权代码,发现 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
才能获取该信息。
如有任何帮助,我们将不胜感激。
更新
I may force a reload at the login route or where ever route a user navigates to, but (I think) because of issue 2 above, I am running into infinite redirects.
我想出了这部分。我只是在会话中设置了一个 key/value 。如果为 true,则重新加载并删除密钥或将其设置为 false,以便重新加载仅发生一次。
好吧,正确的方法是在您的路线中手动进行混音。查看 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);
},