美文网首页
Jfinal如何为不同的应用提供不同的认证与授权

Jfinal如何为不同的应用提供不同的认证与授权

作者: CrazyAirhead | 来源:发表于2020-03-04 07:46 被阅读0次

背景

我们需要先了解下认证和授权,因为这两个概念常常被混淆。认证是鉴定用户身份的过程,它通常使用一个标识符 (如用户名或电子邮件地址)和一个加密令牌(比如密码或者存取令牌)来 鉴别用户身份(处理我是谁的问题)。授权是指验证用户是否允许做某件事的过程(处理我能做什么的问题)。更详细描述可以参看这里

接下来说说,我们可能碰到的问题,一个产品可能会发布多个前端应用,比如Web,APP,小程序(微信,百度等),管理后台,不同的前端应用可能会有不同需求的。比如微信的授权认证和App的认证就不一致,Web和APP因为能力不同,需要的接口也可能不同,而管理后台可能要基于角色进行授权。

解决方案

面对这些问题的时候我们使用Jfinal该如何解决呢?

首先需要参看文档,配置路由Routes 级别拦截器

我们可以针对不同的前端应用进行路由拆分和模块化,同时为不同的Routes添加各自的拦截器,实现不同的级别的认证与授权。

public class WebRoutes extends Routes {
    public void config() {
      addInterceptor(new JwtInterceptor());
      add("/api/web/demo", DemoWebController.class);
    }
}

public class AppRoutes extends Routes {
    public void config() {
      addInterceptor(new JwtInterceptor());
      add("/api/app/demo", DemoController.class);
    }
}

public class WechatRoutes extends Routes {
    public void config() {
      addInterceptor(new WechatInterceptor());
      addInterceptor(new JwtInterceptor());
      add("/api/wechat/demo", DemoController.class);
    }
}

public class AdminRoutes extends Routes {
    public void config() {
      addInterceptor(new AdminAuthInterceptor());
      add("/admin/api/demo", DemoAdminController.class);
    }
}

public class JwtInterceptor implements Interceptor {
    public void intercept(Invocation inv) {
       System.out.println("Verify Jwt");
       inv.invoke();
    }
}

public class JwtInterceptor implements Interceptor {
    public void intercept(Invocation inv) {
       System.out.println("Verify Wechat");
       inv.invoke();
    }
}

public class AdminAuthInterceptor implements Interceptor {
    public void intercept(Invocation inv) {
       System.out.println("Verify Admin");
       inv.invoke();
    }
}

public class DemoController extends Controller {
  //登录接口,清理指定拦截器
  @Clear({WechatInterceptor.class, JwtInterceptor.class})
  public void login() {
  }
}

public class DemoConfig extends JFinalConfig {
    public void configRoute(Routes me) {
      me.add(new WebRoutes());  // Web路由
      me.add(new AppRoutes());  // App路由
      me.add(new WechatRoutes());  // App路由
      me.add(new AdminRoutes());  // 后端路由
    }
    public void configConstant(Constants me) {}
    public void configEngine(Engine me) {}
    public void configPlugin(Plugins me) {}
    public void configInterceptor(Interceptors me) {}
    public void configHandler(Handlers me) {}
}

以上代码并非完整代码,也没有实现实际的拦截器逻辑,只是为了简要的说明问题,如果你在实际的实现过程中碰到问题,可以和我联系,或许能帮上忙。通过配置不同的路由和拦截器,我们还可以尽可能多的复用代码(Controller和Service)。

参看资料

https://insights.thoughtworks.cn/api-2/

https://jfinal.com/doc

https://www.yiiframework.com/doc/guide/2.0/zh-cn

相关文章

网友评论

      本文标题:Jfinal如何为不同的应用提供不同的认证与授权

      本文链接:https://www.haomeiwen.com/subject/qsxplhtx.html