Ember如何让登录路由排除继承全局授权检查Mixin?
解决方法:让登录路由跳过ApplicationRoute的授权Mixin
嘿,这个问题我之前也碰到过,完全理解你不想挨个路由导入Mixin的痛点——确实容易漏,维护起来也麻烦。给你几个不用改全局导入方式的解决方案:
方案1:在授权Mixin里添加路由判断(最推荐)
既然所有路由都会继承ApplicationRoute的Mixin,那我们直接在Mixin的授权逻辑里加个判断:如果当前是登录路由,就跳过检查。这样不用动任何路由的继承关系,代码改动最小。
举个例子,假设你的授权Mixin是这样的:
// app/mixins/auth-check.js import Mixin from '@ember/object/mixin'; export default Mixin.create({ beforeModel(transition) { // 关键:判断目标路由是否是登录路由(这里替换成你实际的登录路由名称) if (transition.targetName !== 'login') { // 你的授权检查逻辑,比如验证用户是否登录 const isAuthenticated = this.get('session.isAuthenticated'); if (!isAuthenticated) { transition.abort(); this.transitionTo('login'); } } // 别忘了调用父类的beforeModel方法 this._super(...arguments); } });
这样ApplicationRoute引入这个Mixin后,所有路由都会触发授权检查,唯独登录路由会直接跳过,完美解决你的问题。
方案2:让登录路由绕过ApplicationRoute的钩子(进阶)
如果你不想在Mixin里加条件判断,还可以修改登录路由的实现,让它不触发ApplicationRoute的相关钩子。Ember里可以通过重写钩子并跳过父类调用,但这种方式要小心,因为可能会影响其他全局逻辑。
示例代码:
// app/routes/login.js import Route from '@ember/routing/route'; export default Route.extend({ beforeModel(transition) { // 直接执行自己的逻辑,不调用父类(ApplicationRoute)的beforeModel // 这里放登录路由自己的前置逻辑,比如如果已经登录就跳转到首页 if (this.get('session.isAuthenticated')) { this.transitionTo('dashboard'); } // 注意:不要调用this._super(...arguments),这样就不会触发ApplicationRoute里的Mixin逻辑 } });
这种方式适合你需要完全隔离登录路由和全局路由逻辑的场景,但要注意如果ApplicationRoute还有其他重要的全局钩子(比如设置全局控制器属性),可能会影响登录路由的功能。
为什么不推荐挨个导入Mixin?
你提到的临时方案确实容易出错——万一哪天新增了路由忘了导入Mixin,就会出现未授权的漏洞,而且维护成本很高。上面的两个方案都是一次性配置,一劳永逸。
内容的提问来源于stack exchange,提问作者shmit
相关产品推荐
相关产品推荐

