基于jfinal Template的Shiro 标签

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标签,原理类似。

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标签,原理类似。

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);
}```
时间: 2024-11-01 12:04:23

基于jfinal Template的Shiro 标签的相关文章

值判断-shiro 标签 值如何判空

问题描述 shiro 标签 值如何判空 需求是,若昵称为空则显示"佚名"如何根据判断shiro标签的值?

【基于url权限管理 shiro(一)】--基础

只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源.权限管理包括用户认证和授权两部分.     用户认证 1.概念 用户认证,用户去访问系统,系统要验证用户身份的合法性.最常用的用户身份验证的方法:1.用户名密码方式.2.指纹打卡机.3.基于证书验证方法..系统验证用户身份合法,用户方可访问系统的资源.   2.用户认证流程     3.关键对象 subject:主体,理解为用户,可能是程序,都要去访问系

基于url权限管理 shiro基础

什么是权限管理 只要有用户参与的系统一般都要有权限管理,权限管理实现对用户访问系统的控制,按照安全规则或者安全策略控制用户可以访问而且只能访问自己被授权的资源. 权限管理包括用户认证和授权两部分. 用户认证 概念 用户认证,用户去访问系统,系统要验证用户身份的合法性.最常用的用户身份验证的方法: 1.用户名密码方式 2.指纹打卡机 3.基于证书验证方法 系统验证用户身份合法,用户方可访问系统的资源. 用户认证流程 关键对象 subject:主体,理解为用户,可能是程序,都要去访问系统的资源,系统

zrlog 1.7 发布,基于 JFinal/简洁好用的开源博客

ZrLog是使用Java开发的博客/CMS程序,具有简约,易用,组件化,内存占用低等特点.自带Markdown编辑器,让更多的精力放在写作上,而不是花费大量时间在学习程序的使用上. 距离上一个版本的发布又快半年了,这个版本主要是修复bug,增强程序的稳定性,以及升级JFinal到3.1,Java版本提升至1.7,同时将原有的开源协议由GPLv2改为更为宽松的Apache. v1.5以后版本可通过后台管理提供系统更新直接进行升级,windows环境可能会有升级失败的情况,可尝试手动解压下升级过程中

基于Spring框架的Shiro配置方法_java

一.在web.xml中添加shiro过滤器 <!-- Shiro filter--> <filter> <filter-name>shiroFilter</filter-name> <filter-class> org.springframework.web.filter.DelegatingFilterProxy </filter-class> </filter> <filter-mapping> <f

短文本分析----基于python的TF-IDF特征词标签自动化提取

绪论 最近做课题,需要分析短文本的标签,在短时间内学习了自然语言处理,社会标签推荐等非常时髦的技术.我们的需求非常类似于从大量短文本中获取关键词(融合社会标签和时间属性)进行用户画像.这一切的基础就是特征词提取技术了,本文主要围绕关键词提取这个主题进行介绍(英文). 不同版本python混用(官方用法) Python2 和python3 是一个神一般的存在,如何让他们共存呢,直到我用了pycharm我才知道为啥这么多人选择它,如下图所示配置两个目录直接可以混用了,叼炸天. 插播一个广告,想修改p

《基于MPLS的流量工程(修订版)》一2.4 标签分配协议配置

2.4 标签分配协议配置 基于MPLS的流量工程(修订版) 这一节将会介绍基本的LDP配置方法.假设你已经知道如何配置IGP路由协议了.各个方面的MPLS TE配置将会在本书的其余章节加以介绍. LDP的配置任务包括以下几步: 配置CEF. 全局配置MPLS转发. 接口层次的配置. 考虑图2-31所示的服务提供商的网络.这里的目标是实现一个支持MPLS的核心网.这一节将会介绍一个核心路由器12008a的配置,以支持MPLS,使之作为一个LSR运行.为了在整个网络中支持MPLS,当然需要启用CEF

基于JQuery的多标签实现代码_jquery

今天要分享的是基于JQuery实现的多标签的切换,JQuery就不用过多介绍了,网上一搜一大堆资料,当然这样的小示例也有很多,这里只是发表一些自己的想法. 下面是本次示例所使用的HTML页面: 复制代码 代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd"> <html xmlns="http://ww

Apache Shiro 使用手册(三)Shiro 授权

授权即访问控制,它将判断用户在应用程序中对资源是否拥有相应的访问权限. 如,判断一个用户有查看页面的权限,编辑数据的权限,拥有某一按钮的权限,以及是否拥有打印的权限等等.  一.授权的三要素  授权有着三个核心元素:权限.角色和用户.  权限 权限是Apache Shiro安全机制最核心的元素.它在应用程序中明确声明了被允许的行为和表现.一个格式良好好的权限声明可以清晰表达出用户对该资源拥有的权限. 大多数的资源会支持典型的CRUD操作(create,read,update,delete),但是