文档章节

在FreeMarker中使用JFinal插件shiro的方法

chenhai_bj
 chenhai_bj
发布于 2014/04/05 17:02
字数 311
阅读 1939
收藏 16


  直接上代码: 

  hasRole方法的实现类:

public class HasRoleFreeMarkerMethod implements TemplateMethodModel{

	@SuppressWarnings("rawtypes")
	@Override
	public Object exec(List list) throws TemplateModelException {
		if(null == list || 1 != list.size()){
			throw new TemplateModelException("Wrong arguments: only one argument is allowed");
		}
		
		String roleName = (String) list.get(0);
		return getSubject() != null && roleName != null
				&& roleName.length() > 0 && getSubject().hasRole(roleName);
	}

	private static Subject getSubject() {
		return SecurityUtils.getSubject();
	}

}

  hasAnyRoles方法的实现类:

public class HasAnyRolesFreeMarkerMethod implements TemplateMethodModel{

	@SuppressWarnings("rawtypes")
	@Override
	public Object exec(List list) throws TemplateModelException {
		//参数不合法直接返回false
		if(null == list || list.isEmpty()){
			return false;
		}
		// 循环判断当前用用户是否拥有其中的某一个角色
		boolean hasAny = false;
		for(Object obj : list){
			System.out.println(obj);
			if(getSubject().hasRole((String)obj)){
				hasAny = true;
				break;
			}
		}
		return hasAny;
	}

	private static Subject getSubject() {
		return SecurityUtils.getSubject();
	}

}

  剩余方法的实现方式与上面一样,在这省略......

  然后写一个全局Interceptor: ShiroFreeMarkerInterceptor

public class ShiroFreeMarkerInterceptor implements Interceptor {

	public void intercept(ActionInvocation 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();
	}
}

  在JFinal中配置拦截器:

public void configInterceptor(Interceptors me) {
		me.add(new ShiroInterceptor());
		me.add(new ShiroFreeMarkerInterceptor());
	}

   页面中使用方式:

<#if hasAnyRoles("admin","user")>
    <input type="button" value="查看"/>
</#if>
<#if hasRole("admin")>
    <input type="button" value="编辑"/>
</#if>


© 著作权归作者所有

共有 人打赏支持
chenhai_bj
粉丝 6
博文 4
码字总数 1609
作品 0
海淀
私信 提问
加载中

评论(3)

zcqshine
zcqshine
这个插件跟jfinal2.0好像不兼容了
chenhai_bj
chenhai_bj

引用来自“JFinal”的评论

非常简洁,感谢分享,如果 HasRoleFreeMarkerMethod 这些类是无状态的,可以不用每次都 new 出来,可以作为拦截器中的属性存在,提升点性能,顶一个 79

确实有道理,而且也不一定加为全局的拦截器,只需在页面上需要这些标签的controller上添加即可。

JFinal
JFinal
非常简洁,感谢分享,如果 HasRoleFreeMarkerMethod 这些类是无状态的,可以不用每次都 new 出来,可以作为拦截器中的属性存在,提升点性能,顶一个 79
使用Freesql简单地实现多条件查询

在实际应用中我们经常会遇到多条件查询的情景,以往的解决方案是在java中对各个参数值进行非空之类的判断,再进行sql及参数的拼凑。 其实还有更简单的解决方法的--用Freemarker。Freemarker可...

jse7en
2014/03/23
0
4
Jfinal中FreemarkerRender小改进

在与朋友讨论中,说到jf中的FreemarkerRender不能读到jar中的文件,查看jf源码是没有加入Freemarker的ClassTemplateLoder.读不到jar包中的静态文件,尝试着自己改进了下这个render。 把jfina...

kyle1970
2013/01/03
0
5
JFinal 整合 Shiro 补充Realm类和数据库

JFinal 整合 Shiro原文: http://my.oschina.net/smile622/blog/135098 在此基础上 补充数据库和MyShiroRealm.java users表 SET FOREIGNKEYCHECKS=0; -- Table structure for DROP TABLE IF E......

stu51
2013/10/14
0
5
springrain vs jfianl的开发对比

废话不说,上实例 使用 jfinal最新版本 1.4 的 blog demo. 如果使用springrain 该怎么做呢? 总共分三步: 1.编写blog.sql 建表语句,花费2分钟左右时间 2.执行代码生成器,gen blog 并把生成文件...

光石头
2013/09/07
0
21
JFinal使用Freemarker作为展示层中的国际化配置使用

最近在使用jfinal,如果使用jsp作为展现层的文件,使用jfinal的国际化很简单,直接 I18N.getText("key")就可以了,如果使用freemarker就没这么简单了,不能所有的国际化文字都通过 Controll...

hulang
2014/04/27
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Apache防盗链配置,Directory访问控制,FilesMatch进行访问控制

防盗链配置 通过限制referer来实现防盗链的功能 配置前,使用curl -e 指定referer [root@test-a test-webroot]# curl -e "http://www.test.com/1.html" -x127.0.0.1:80 "www.test.com/1.jpg......

野雪球
16分钟前
1
0
RxJava threading

因为Rx针对异步系统设计,并且Rx也自然支持多线程,所以新的Rx开发人员有时会假设Rx默认是多线程的。在其他任何事情之前,重要的是澄清Rx默认是单线程的。 除非另有说明,否则每次调用onNex...

woshixin
16分钟前
0
0
Python的安装及文件类型、变量

一、为什么学习python 服务于大数据、人工智能、自动化运维。 简单易学 代码简洁 薪资高 近几年越来越火 二、Python的安装 linux 系统默认安装, CentOS7 默认安装了python2.7 安装ipython y...

枫叶云
24分钟前
0
0
JeeSite 4.x 树形结构的表设计和用法

有些同仁对于 JeeSite 4 中的树表设计不太了解,本应简单的方法就可实现,却写了很多复杂的语句和代码,所以有了这篇文章。 在 JeeSite 4 中的树表设计我还是相对满意的,这种设计比较容易理...

ThinkGem
31分钟前
19
0
0022-如何永久删除Kafka的Topic

1.问题描述 使用kafka-topics --delete命令删除topic时并没有真正的删除,而是把topic标记为:“marked for deletion”,导致重新创建相同名称的Topic时报错“already exists”。 2.问题复现...

Hadoop实操
33分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部