zoukankan      html  css  js  c++  java
  • 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>
  • 相关阅读:
    第三十章 混合线程同步构造
    第二十九章 基元线程同步构造
    第二十八章 I/O限制的异步操作
    第二十七章 计算限制的异步操作
    第二十六章 线程基础
    第二十五章 与WinRT组件互操作
    css实现排序箭头
    js中的toFixed神坑
    react使用中碰到的小问题
    看到一个js中sleep的例子,挺好玩的
  • 原文地址:https://www.cnblogs.com/yzssoft/p/6970478.html
Copyright © 2011-2022 走看看