我可以在 vue.js 中将授权逻辑放在哪里?

Posted

技术标签:

【中文标题】我可以在 vue.js 中将授权逻辑放在哪里?【英文标题】:Where i may put authorization logic in vue.js? 【发布时间】:2019-08-11 17:45:18 【问题描述】:

我为 firebase 创建授权组件。并且发现了很多关于如何创建授权服务的帖子,该帖子的大部分内容是关于创建一些全局 const 或非常有趣的方式 - 使用 auth 方法创建 vue 插件。

但是当我自己做时,我很容易在 vuex 中创建 Auth 模块,并在创建 app.vue 生命周期时调用操作以检查用户并将该数据传递到存储中。

Post 在 vue 插件中创建身份验证时。

还有我的解决方案

import VuexModule, Module, Mutation, Action from 'vuex-module-decorators'
import * as firebase from 'firebase';
import  SingUpActionPayload, ResponseError, SingUpMutationPayload from "./interfaces/singUp";

@Module
export default class Auth extends VuexModule 
    singUpData: any;
    singUpError: ResponseError = 
        code: '',
        message: ''
    ;

    @Action(rawError: true)
    async singUp (payload: SingUpActionPayload) 
        try 
            let result = firebase.auth().createUserWithEmailAndPassword(payload.email, payload.password);
            await result;
            this.context.commit('setCurrentUser', firebase.auth().currentUser);
            this.context.commit('setSingUpResult', type: 'result', result);
         catch (error) 
            this.context.commit('setSingUpResult', type: 'error', error);
        
    


    @Mutation
    setSingUpResult(payload: any)
        if(payload.type === 'result')
            this.singUpData = payload.result;
         else 
            this.singUpError = payload.error;
        

    





@Module
export default class UserModule extends VuexModule 
    currentUser = null;

    @Action(commit: 'setCurrentUser')
    takeCurrentUser()
        return  firebase.auth().currentUser;
    

    @Mutation
    setCurrentUser(payload: any)
        this.currentUser = payload;
    


对于路由器,我有类似帖子中的逻辑,只需从状态中检查用户。

所以现在我有一个问题,什么方式更好,带有身份验证服务或 vuex 模块的 vue 插件?

【问题讨论】:

【参考方案1】:

在您的案例中存在三个不同的工件:Vue 插件Auth ServiceVuex 模块!!!

认证服务

您需要身份验证服务来抽象您的 Authorization Server(Firebase) API。 Auth 服务应该不具备 DOM 或 Store 的知识。它严格处理网络层。

Vuex 商店

如果您需要在应用程序的不同视图/组件中提供身份验证数据,那么您应该在 store 中维护身份验证数据。因此,您的路由器或组件将与 Vuex 商店 通信,后者又通过商店 actionsAuth Service 通信。

Vue 插件

现在,这变得有趣了。如果您有多个(和单页)应用程序需要类似的功能,并且它们是不同的包或维护在不同的存储库中,那么插件是共享这种可重用逻辑的最佳方式。另外,如果你的代码需要做any of the following,那么你需要一个插件:

添加一些全局方法或属性 添加一个或多个全局资产:指令/过滤器/转换 通过全局 mixin 添加一些组件选项。 通过将一些 Vue 实例方法附加到 Vue.prototype 来添加它们。 一个提供自己的 API 的库,同时注入上述的某种组合。

由于您的 Vuex 商店可以通过操作处理身份验证,因此您可能不需要插件。

就在此身份验证数据之上运行的实用功能而言,您可以简单地使用标准 ES 模块,而不是包装然后使用 Vue.js 插件

【讨论】:

以上是关于我可以在 vue.js 中将授权逻辑放在哪里?的主要内容,如果未能解决你的问题,请参考以下文章

在 DDD 中将全局规则验证放在哪里

在 MVC 中将视图状态之类的选择放在哪里?

在 MVC 架构中将业务逻辑保留在哪里?

Lumen 中的业务逻辑应该放在哪里?

MVC:把业务逻辑放在哪里? [关闭]

干净的架构——在哪里放置输入验证逻辑? [关闭]