背景
我们需要先了解下认证和授权,因为这两个概念常常被混淆。认证是鉴定用户身份的过程,它通常使用一个标识符 (如用户名或电子邮件地址)和一个加密令牌(比如密码或者存取令牌)来 鉴别用户身份(处理我是谁的问题)。授权是指验证用户是否允许做某件事的过程(处理我能做什么的问题)。更详细描述可以参看这里。
接下来说说,我们可能碰到的问题,一个产品可能会发布多个前端应用,比如Web,APP,小程序(微信,百度等),管理后台,不同的前端应用可能会有不同需求的。比如微信的授权认证和App的认证就不一致,Web和APP因为能力不同,需要的接口也可能不同,而管理后台可能要基于角色进行授权。
解决方案
面对这些问题的时候我们使用Jfinal该如何解决呢?
首先需要参看文档,配置路由,Routes 级别拦截器。
我们可以针对不同的前端应用进行路由拆分和模块化,同时为不同的Routes添加各自的拦截器,实现不同的级别的认证与授权。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| 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()); me.add(new AppRoutes()); me.add(new WechatRoutes()); 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