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()``` 用户未登录状态显示带入参类型标签处理
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); }``` 页面使用body
打完 收工~
指令注解加载
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());}
页面中使用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; }}
页面中使用共享对象扩展
使用这种形式就更舒服了
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);}
页面使用body
打完 收工~
指令注解加载
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());}
页面中使用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; }}
页面中使用共享对象扩展
使用这种形式就更舒服了
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);}
页面使用body
打完 收工~
指令注解加载
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); }```