用户操作

2018-11-29 01:51:30

用户对象

前端

Cabloy通过Vuex机制管理前端的当前登录状态,从而方便其他地方直接引用用户信息

const op = this.$store.state.auth.user.op;
const agent = this.$store.state.auth.user.agent;
const loggedIn = this.$store.state.auth.loggedIn;
名称 说明
auth.user.op 当前操作用户
auth.user.agent 当前登陆用户
auth.loggedIn 是否已登录

如果没有使用用户代理,那么op === agent

后端

Cabloy通过中间件机制向ctx注入了user对象,便于直接访问user信息

const op = this.ctx.user.op;
const agent = this.ctx.user.agent;
const loggedIn = this.ctx.isAuthenticated()
名称 说明
ctx.user.op 当前操作用户
ctx.user.agent 当前登陆用户
ctx.isAuthenticated() 是否已登录

初次访问系统

当用户初次访问系统,前端会首先访问后端API路由/a/base/auth/echo,通过返回的user信息判断当前用户是否已经登录,同时会将user信息存入Vuex状态管理对象中

egg-born-front/src/inject/pages/app.vue

// get auth first
this.$api.post('/a/base/auth/echo').then(data => {
  // Vuex
  this.$store.commit('auth/login', {
    loggedIn: data.user.agent.anonymous === 0,
    user: data.user,
  });
};      

登录页面

Cabloy提供了一个统一的登录页面配置机制,可以在登录页面中自由组合UserPassword登录UI组件,和Github等第三方认证的登录按钮组件

具体信息,请参见:Cabloy:认证

验证用户

Cabloy提供了中间件auth,用于在后端API路由验证用户。如果验证不通过会自动抛出异常,中断后续逻辑

中间件auth由模块a-base提供,其源代码如下:

module.exports = options => {
  return async function auth(ctx, next) {
    if (!ctx.isAuthenticated() || !ctx.user.op || !ctx.user.agent) {
      // anonymous
      await ctx.meta.user.loginAsAnonymous();
    } else {
      // check if deleted,disabled,agent
      await ctx.meta.user.check();
    }

    // if user
    if (options.user && ctx.user.op.anonymous) ctx.throw(401);

    // next
    await next();
  };
};

禁用中间件auth

中间件auth全局中间件,所以会自动附加到所有API路由中。如果要禁用中间件auth,配置如下:

a-base-sync/backend/src/routes.js

{ method: 'post', path: 'auth/echo', controller: auth, 
  meta: { auth: { enable: false } } 
},

配置中间件auth

中间件auth还可传入参数user,用于指定当前用户必须是认证用户

a-base-sync/backend/src/routes.js

{ method: 'post', path: 'auth/check', controller: auth, 
  meta: { auth: { user: true } } 
},


评论: