JFinal配合Shiro权限控制在FreeMarker模板引擎中控制到按钮粒度的使用
实现在FreeMarker模板中控制对应按钮的显示隐藏主要用到了Shiro中的hasRole, hasAnyRoles, hasPermission以及Authenticated等方法,我们可以实现TemplateMethodModelEx类的相关操作,然后通过全局拦截器将对应的方法注入到视图模板中,就可以直接在ftl模板中使用自定义的方法进行判断了,具体代码如下:
第一步实现 HasPermissionFreeMarkerMethod
public class HasPermissionFreeMarkerMethod implements TemplateMethodModelEx { @Override public Object exec(List list) throws TemplateModelException { if (null == list || 1 != list.size()) { throw new TemplateModelException("Wrong arguments: only one argument is allowed"); } Object permissionName = list.get(0); return getSubject() != null && permissionName != null && getSubject().isPermitted(permissionName.toString()); } private static Subject getSubject() { return SecurityUtils.getSubject(); } }
第二步定义一个全局的拦截器
public class ShiroFreeMarkerInterceptor implements Interceptor { @Override public void intercept(Invocation ai) { Controller c = ai.getController(); c.setAttr("hasRole", new HasRoleFreeMarkerMethod()); //c.setAttr("hasAnyRoles", new HasAnyRolesFreeMarkerMethod()); c.setAttr("hasPermission", new HasPermissionFreeMarkerMethod()); //c.setAttr("isAuthenticated", new AuthenticatedFreeMarkerMethod()); // 执行正常逻辑 ai.invoke(); } }
第三步在AppConfig中配置全局拦截器
/** * 配置全局拦截器 */ public void configInterceptor(Interceptors me) { me.add(new ShiroInterceptor()); me.add(new AuthInterceptor()); me.add(new ShiroFreeMarkerInterceptor());//添加在FreeMarker视图中使用Shiro的拦截器 }
现在我们就可以在视图中直接来根据权限标识控制按钮的显示与隐藏了
<#if hasPermission("Trade:新增")> <a class="btn_color_1" onclick="onEdit(0)"><i class="fa fa-plus"></i> 新增</a> </#if> <#if hasPermission("Trade:编辑")> <a class="btn_color_2" onclick="onEdit()"><i class="fa fa-edit"></i> 编辑</a> </#if> <#if hasPermission("Trade:删除")> <a class="btn_color_3" onclick="onDelete()"><i class="fa fa-remove"></i> 删除</a> </#if> <#if hasPermission("Trade:重新统计")> <a class="btn_color_2" onclick="onTongJi()"><i class="fa fa-bolt"></i> 重新统计</a> </#if>