文档章节

基于jfinal Template的Shiro 标签

冷冷gg
 冷冷gg
发布于 2017/06/19 03:38
字数 621
阅读 944
收藏 27
点赞 3
评论 4

jfinal template 经过 3.0、3.1 两个版本的迭代,已经非常稳定优秀了,所以我从传统的jsp 迁移到了jf template ,jsp中使用shiro 的标签库,可以很方便的实现权限的控制例如:

<shiro:guest>  
    用户未登录状态显示
</shiro:guest>  

<shiro:user>  
    欢迎[<shiro:principal/>]登录
</shiro:user>  

结合jf模板灵活指令扩展,来实现这么一套标签非常简单。

继承Directiv形式

public class GuestTag extends Directiv {
    private Subject getSubject() {
        return SecurityUtils.getSubject();
    }
    
    public void exec(Env env, Scope scope, Writer writer) {
        if (getSubject() == null || getSubject().getPrincipal() == null)
            stat.exec(env, scope, writer);
    }

    public boolean hasEnd() {
        return true;
    }
}


在config中配置
public void configEngine(Engine me) {
     me.addDirective("guest", new GuestTag());
}

页面中使用
#guest()
    用户未登录状态显示
#end

带入参类型标签处理

public class HasRoleTag extends Directiv {
    private Expr[] exprs;
    
     private Subject getSubject() {
        return SecurityUtils.getSubject();
    }
    
    public void setExprList(ExprList exprList) {
        exprs = exprList.getExprArray();
    }

    public void exec(Env env, Scope scope, Writer writer) {
        boolean hasRole = false;
        if (getSubject() != null && ArrayUtil.isNotEmpty(exprs))
            if (getSubject().hasRole(exprs[0].toString()))
                hasRole = true;

        if (hasRole)
            stat.exec(env, scope, writer);
    }

    public boolean hasEnd() {
        return true;
    }

}


页面中使用

#hasRole(roleName)
    body
#end

共享对象扩展

使用这种形式就更舒服了

public class ShiroTag {
    private Subject getSubject() {
        return SecurityUtils.getSubject();
    }
   
    public boolean isGuest() {
        return getSubject() == null || getSubject().getPrincipal() == null;
    }
 
    public boolean hasRole(String roleName) {
        return getSubject() != null && getSubject().hasRole(roleName);
    }
 
  
    public boolean lacksRole(String roleName) {
        boolean hasRole = getSubject() != null
                && getSubject().hasRole(roleName);
        return !hasRole;
    }
}

config中配置一下

public void configEngine(Engine me) {
    me.addSharedObject("shiro",ShiroTag);
}

页面使用
#if(shiro.hasRole(roleName))
body
#end

打完 收工~

指令注解加载

shiro标签种类很多,具体的逻辑也可以自己实现,所以我们写好以后,配置在config 是一件比较痛苦的事情,稍不留神,就配置错误了。所以我们可以通过注解扫描的形式方便配置。(其他自定义指令 也可以使用,方法相同)

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.TYPE)
@Documented
//@Inherited 不继承
public @interface DefineDirective {
    /**
     * 标签名称
     *
     * @return String
     */
    String tag() default "";
}


@DefineDirective(tag = "hasRole")
public class HasRoleTag extends Directiv {...}

然后写这么一个EngineKit

    //classUtils  使用的是 hutool 工具包的方法。。。
    public static void addShiroDefineDirective(Engine me) {
        Set<Class<?>> classes = ClassUtil.scanPackageByAnnotation(defineDirective, DefineDirective.class);
        for (Class<?> clazz : classes) {
            DefineDirective defineDirective = clazz.getAnnotation(DefineDirective.class);
            String tag = defineDirective.tag();
            if (StrUtil.isNotEmpty(tag)) {
                me.addDirective(tag, (Directive) ClassUtil.newInstance(clazz));
            } else {
                LogKit.error("自定义Directive的标签为空无效:" + clazz.getName());
            }
        }
    }

config中配置一下

public void configEngine(Engine me) {
    EngineKit.addShiroDefineDirective(me);
}

PS

当然上边的扩展,并没有和我们的shiro插件集成,我实现了一个与JfinalShiroPlugin@玛雅牛无缝集成的版本内置这个shiro标签,原理类似。

JfinalShiroPlugin: http://git.oschina.net/log4j/jfinalshiroplugin

然后具体使用项目整合栗子: http://git.oschina.net/log4j/LMS

© 著作权归作者所有

共有 人打赏支持
冷冷gg
粉丝 248
博文 106
码字总数 46179
作品 1
潍坊
UI设计师
加载中

评论(4)

冷冷gg
冷冷gg

引用来自“JFinal”的评论

这个整合非常简洁干净,感谢你的分享 :thumbsup:

最后那个 shared object 貌似有个笔误,应该是这么用:
#if(shiro.hasRole(roleName))
body
#end
已经更改 ,谢波总指导
JFinal
JFinal
这个整合非常简洁干净,感谢你的分享 :thumbsup:

最后那个 shared object 貌似有个笔误,应该是这么用:
#if(shiro.hasRole(roleName))
body
#end
冷冷gg
冷冷gg

引用来自“如梦技术”的评论

:+1:
:innocent:
如梦技术
如梦技术
:+1:
Apache Shiro 使用手册(三)Shiro 授权

一、授权的三要素 授权有着三个核心元素:权限、角色和用户。 权限 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清...

heroShane ⋅ 2014/02/10 ⋅ 0

shiro 授权介绍

一、授权的三要素 授权有着三个核心元素:权限、角色和用户。 权限 权限是Apache Shiro安全机制最核心的元素。它在应用程序中明确声明了被允许的行为和表现。一个格式良好好的权限声明可以清...

kevin728971010 ⋅ 2016/11/07 ⋅ 0

shiro 使用

在使用Shiro标签库前,首先需要在JSP引入shiro标签: <%@ taglib prefix="shiro" uri="http://shiro.apache.org/tags" %> 1、介绍Shiro的标签guest标签 :验证当前用户是否为“访客”,即未认...

_______- ⋅ 2016/09/04 ⋅ 1

Shiro之授权管理与授权的三种方式(1、编程方式,2、注解方式,3、jsp标签)-yellowcong

授权管理,三种方式,其中注解和jsp的方式在开发中用得比较的多,但是对于编程的方式完成注解,在实际开发中,用得不是特别多。这一节,讲解shiro如何完成授权的,授权操作,需要在Reaml中,...

yelllowcong ⋅ 2017/12/20 ⋅ 0

简单shiro扩展实现NOT、AND、OR权限验证

使用过shiro的朋友应该都知道在要想实现any permission的验证是比较麻烦。 很多朋友刚开始接触时以为如<shiro:hasPermission name="showcase:tree:"> 代表验证拥有任何权限,但这是错误的。如...

zh119893 ⋅ 2014/06/27 ⋅ 0

从权限控制到shiro框架的应用

说明:本文很多观点和内容来自互联网以及各种资料,如果侵犯了您的权益,请及时联系我,我会删除相关内容。 权限管理 基本上涉及到用户参与的系统都要进行权限管理,权限管理属于系统安全的范...

神秘的寇先森 ⋅ 01/01 ⋅ 0

SSM(三)Shiro使用详解

前言 相比有做过企业级开发的童鞋应该都有做过权限安全之类的功能吧,最先开始我采用的是建,,,之后在拦截器中对每一个请求进行拦截,再到数据库中进行查询看当前用户是否有该权限,这样的设...

crossoverJie ⋅ 2016/07/15 ⋅ 19

jfinal plugins--jfinal-dreampie

jfinal好用的插件正在开发,下载源码https://github.com/Dreampie/jfinal-dreampie,maven引入方式:http://search.maven.org/ 输入jfinal-dreampie搜索 <dependencies><dependency> </depen......

Dreampie ⋅ 2014/07/31 ⋅ 1

Apache Shiro权限管理框架

Apache Shiro 和Web项目集成 web.xml配置 Spring.xml配置 用户权限模型 在揭开 Shiro 面纱之前,我们需要认知用户权限模型。本文所提到用户权限模型,指的是用来表达用户信息及用户权限信息的...

满小茂 ⋅ 2016/05/03 ⋅ 3

Shiro 那点事儿

前几天我遇见了一位美女,真有种相逢恨晚的感觉。她皮肤白皙、气质优雅、楚楚动人,拥有苗条的身材,却又不失丰满之躯,正所谓“该大的地方大,该小的地方小”,她就是我朝思梦想的情人。 她...

黄勇 ⋅ 2014/03/17 ⋅ 40

没有更多内容

加载失败,请刷新页面

加载更多

下一页

OSChina 周日乱弹 —— 这么好的姑娘都不要了啊

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @TigaPile :分享曾惜的单曲《讲真的》 《讲真的》- 曾惜 手机党少年们想听歌,请使劲儿戳(这里) @首席搬砖工程师 :怎样约女孩子出来吃饭,...

小小编辑 ⋅ 22分钟前 ⋅ 1

Jenkins实践3 之脚本

#!/bin/sh# export PROJ_PATH=项目路径# export TOMCAT_PATH=tomcat路径killTomcat(){pid=`ps -ef | grep tomcat | grep java|awk '{print $2}'`echo "tom...

晨猫 ⋅ 今天 ⋅ 0

Spring Bean的生命周期

前言 Spring Bean 的生命周期在整个 Spring 中占有很重要的位置,掌握这些可以加深对 Spring 的理解。 首先看下生命周期图: 再谈生命周期之前有一点需要先明确: Spring 只帮我们管理单例模...

素雷 ⋅ 今天 ⋅ 0

zblog2.3版本的asp系统是否可以超越卢松松博客的流量[图]

最近访问zblog官网,发现zlbog-asp2.3版本已经进入测试阶段了,虽然正式版还没有发布,想必也不久了。那么作为aps纵横江湖十多年的今天,blog2.2版本应该已经成熟了,为什么还要发布这个2.3...

原创小博客 ⋅ 今天 ⋅ 0

聊聊spring cloud的HystrixCircuitBreakerConfiguration

序 本文主要研究一下spring cloud的HystrixCircuitBreakerConfiguration HystrixCircuitBreakerConfiguration spring-cloud-netflix-core-2.0.0.RELEASE-sources.jar!/org/springframework/......

go4it ⋅ 今天 ⋅ 0

二分查找

二分查找,也称折半查找、二分搜索,是一种在有序数组中查找某一特定元素的搜索算法。搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束;如果某一特定元素大于...

人觉非常君 ⋅ 今天 ⋅ 0

VS中使用X64汇编

需要注意的是,在X86项目中,可以使用__asm{}来嵌入汇编代码,但是在X64项目中,再也不能使用__asm{}来编写嵌入式汇编程序了,必须使用专门的.asm汇编文件来编写相应的汇编代码,然后在其它地...

simpower ⋅ 今天 ⋅ 0

ThreadPoolExecutor

ThreadPoolExecutor public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, ......

4rnold ⋅ 昨天 ⋅ 0

Java正无穷大、负无穷大以及NaN

问题来源:用Java代码写了一个计算公式,包含除法和对数和取反,在页面上出现了-infinity,不知道这是什么问题,网上找答案才明白意思是负的无穷大。 思考:为什么会出现这种情况呢?这是哪里...

young_chen ⋅ 昨天 ⋅ 0

前台对中文编码,后台解码

前台:encodeURI(sbzt) 后台:String param = URLDecoder.decode(sbzt,"UTF-8");

west_coast ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部