基于jfinal Template的Shiro 标签

    xiaoxiao2023-09-09  186

    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); }```
    最新回复(0)