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>
  • 相关阅读:
    【BZOJ1006】神奇的国度(弦图)
    弦图
    【BZOJ2946】公共串(后缀数组)
    【POJ1743】Musical Theme(后缀数组)
    JAVA和Tomcat运维整理
    linux shell 之if-------用if做判断
    Linux curl命令详解
    Intel HEX文件解析
    Linux bridge-utils tunctl 使用
    怎样查询锁表的SQL
  • 原文地址:https://www.cnblogs.com/yzssoft/p/6970478.html
Copyright © 2011-2022 走看看