文档章节

给JFinal添加Shiro插件功能,支持Shiro所有注解-HTTL篇

玛雅牛
 玛雅牛
发布于 2013/06/12 23:47
字数 814
阅读 3011
收藏 21

由于使用HTTL模板引擎,所以也想将Shiro和HTTL集成起来。

具体实现如下,此嗲吗和给JFinal添加Shiro插件功能,支持Shiro所有注解-实现篇中的一样。

 

package com.jfinal.ext.plugin.shiro;

import java.util.concurrent.ConcurrentMap;

import org.apache.shiro.SecurityUtils;
import org.apache.shiro.subject.Subject;


/**
 * 将所有Shiro指令封装成HTTL的函数。
 *
 * @author dafei
 */
public class ShiroKit {

	/**
	 * 用来记录那个action或者actionpath中是否有shiro认证注解。
	 */
	private static ConcurrentMap<String, AuthzHandler> authzMaps = null;


	private static final String NAMES_DELIMETER = ",";

	/**
	 * 禁止初始化
	 */
	private ShiroKit() {}

	static void init(ConcurrentMap<String, AuthzHandler> maps) {
		authzMaps = maps;
	}

	static AuthzHandler getAuthzHandler(String actionKey){
		/*
		if(authzMaps.containsKey(controllerClassName)){
			return true;
		}*/
		return authzMaps.get(actionKey);
	}

	/**
	 * 获取 Subject
	 *
	 * @return Subject
	 */
	protected static Subject getSubject() {
		return SecurityUtils.getSubject();
	}

	/**
	 * 验证当前用户是否属于该角色?,使用时与lacksRole 搭配使用
	 *
	 * @param roleName
	 *            角色名
	 * @return 属于该角色:true,否则false
	 */
	public static boolean hasRole(String roleName) {
		return getSubject() != null && roleName != null
				&& roleName.length() > 0 && getSubject().hasRole(roleName);
	}

	/**
	 * 与hasRole标签逻辑相反,当用户不属于该角色时验证通过。
	 *
	 * @param roleName
	 *            角色名
	 * @return 不属于该角色:true,否则false
	 */
	public static boolean lacksRole(String roleName) {
		return !hasRole(roleName);
	}

	/**
	 * 验证当前用户是否属于以下任意一个角色。
	 *
	 * @param roleNames
	 *            角色列表
	 * @return 属于:true,否则false
	 */
	public static boolean hasAnyRoles(String roleNames) {
		boolean hasAnyRole = false;
		Subject subject = getSubject();
		if (subject != null && roleNames != null && roleNames.length() > 0) {
			// Iterate through roles and check to see if the user has one of the
			// roles
			for (String role : roleNames.split(NAMES_DELIMETER)) {
				if (subject.hasRole(role.trim())) {
					hasAnyRole = true;
					break;
				}
			}
		}
		return hasAnyRole;
	}

	/**
	 * 验证当前用户是否属于以下所有角色。
	 *
	 * @param roleNames
	 *            角色列表
	 * @return 属于:true,否则false
	 */
	public static boolean hasAllRoles(String roleNames) {
		boolean hasAllRole = true;
		Subject subject = getSubject();
		if (subject != null && roleNames != null && roleNames.length() > 0) {
			// Iterate through roles and check to see if the user has one of the
			// roles
			for (String role : roleNames.split(NAMES_DELIMETER)) {
				if (!subject.hasRole(role.trim())) {
					hasAllRole = false;
					break;
				}
			}
		}
		return hasAllRole;
	}

	/**
	 * 验证当前用户是否拥有指定权限,使用时与lacksPermission 搭配使用
	 *
	 * @param permission
	 *            权限名
	 * @return 拥有权限:true,否则false
	 */
	public static boolean hasPermission(String permission) {
		return getSubject() != null && permission != null
				&& permission.length() > 0
				&& getSubject().isPermitted(permission);
	}

	/**
	 * 与hasPermission标签逻辑相反,当前用户没有制定权限时,验证通过。
	 *
	 * @param permission
	 *            权限名
	 * @return 拥有权限:true,否则false
	 */
	public static boolean lacksPermission(String permission) {
		return !hasPermission(permission);
	}

	/**
	 * 已认证通过的用户。不包含已记住的用户,这是与user标签的区别所在。与notAuthenticated搭配使用
	 *
	 * @return 通过身份验证:true,否则false
	 */
	public static boolean authenticated() {
		return getSubject() != null && getSubject().isAuthenticated();
	}

	/**
	 * 未认证通过用户,与authenticated标签相对应。与guest标签的区别是,该标签包含已记住用户。。
	 *
	 * @return 没有通过身份验证:true,否则false
	 */
	public static boolean notAuthenticated() {
		return !authenticated();
	}

	/**
	 * 认证通过或已记住的用户。与guset搭配使用。
	 *
	 * @return 用户:true,否则 false
	 */
	public static boolean user() {
		return getSubject() != null && getSubject().getPrincipal() != null;
	}

	/**
	 * 验证当前用户是否为“访客”,即未认证(包含未记住)的用户。用user搭配使用
	 *
	 * @return 访客:true,否则false
	 */
	public static boolean guest() {
		return !user();
	}

	/**
	 * 输出当前用户信息,通常为登录帐号信息。
	 * @return 当前用户信息
	 */
	public String principal(){
		if (getSubject() != null) {
            // Get the principal to print out
            Object principal = getSubject().getPrincipal();
            return principal.toString();
        }
		return "";
	}
}

 

在httl.properties中添加一行代码。

 

import.methods+=com.jfinal.ext.plugin.shiro.ShiroKit

集成完毕,如何使用?

 

 

<!--#if(hasRole("root"))-->
	<td>
	<a href="school/selectSchool?school_id=${school.id}&school_name=${school.name}&callback_action=/class/index" class="btn btn-large btn-block btn-success">班级列表</a>
	</td>
<!--#end-->


<!--#if(hasPermission("card:confirm"))-->
		<button class="btn btn-primary btn-huge btn-wide"  tabindex="3">添加</button>
<!--#end-->

 

用起来还不错。

 

© 著作权归作者所有

共有 人打赏支持
玛雅牛

玛雅牛

粉丝 484
博文 113
码字总数 27360
作品 4
高级程序员
私信 提问
加载中

评论(9)

vviqq
vviqq
哦,看到配置文件了,有个预编译打开了。
vviqq
vviqq
你好,请教博主。我用了下httl,写了几个页面。我当前render的是index.html,怎么会有其它html页面报错说找不到参数。是不是系统启动的时候,就扫描全部模板装载参数。怎么样才能只装载当前使用页面,其它无关页面参数还没有传的。
圣杰是也
圣杰是也
HTTL试试!!谢谢分享。
萧萧恋
萧萧恋
谢谢 我看到了! 很详细的教程!
玛雅牛
玛雅牛

引用来自“萧萧恋”的评论

AuthzHandler 是干什么用的 求指教

访问控制处理 器,因为权限检查有很多种,基于角色、权限、是否登录,AuthzHandler是这一系列检查的抽象接口。最后在ShiroInterceptor 拦截器里通过actionKey获取AuthzHandler,由于采用了组合模式,这个AuthzHandler可能是一个,也可能是多个。拦截器里通过ah.assertAuthorized();来进行权限验证。详细看拦截器实现。
萧萧恋
萧萧恋
AuthzHandler 是干什么用的 求指教
胡小强
胡小强
抽时间试试
玛雅牛
玛雅牛

引用来自“JFinal”的评论

HTTL 好用不? 除了速度快还有什么优点呢? 谢谢分享

HTTL很好用的。速度快是一个优点。
其他有优点:
1)指令简单,HTTL只有 #set, #if, #else, #for, #break, #macro 六个指令,以及输出占位和注释转义,保持最小指令集。
2)可扩展性很强,自定义宏,使用java实现部分方法。
3)默认使用HTML注释语法,避免干扰原生HTML页面,方便美工和程序开发者分工。
4)HTTL采用微核+插件体系,所有环节均可扩展或替换,方便集成和二次开发。
HTTL的主要开发者梁飞也是阿里巴巴的dubbo的主要设计者,设计能力很强,代码质量很高。
JFinal
JFinal
HTTL 好用不? 除了速度快还有什么优点呢? 谢谢分享
给JFinal添加Shiro插件功能,支持Shiro所有注解

个人实现了给JFinal添加Shiro插件功能,支持Shiro所有注解。 写了三篇博客来介绍,还请@JFinal指点。 给JFinal添加Shiro插件功能,支持Shiro所有注解-实现篇 给JFinal添加Shiro插件功能,支持...

玛雅牛
2013/06/13
6.1K
9
JFinal的Shiro权限管理插件 2.0 版发布,支持JFinal 2.0

JFinal的Shiro权限管理插件 更新说明: 1)支持JFinal2.0 2)添加了一些实际项目中的代码供参考。 3)由于shiro需要与具体的业务整合才能使用,所以这个插件仅仅是方便在jfinal中使用shiro。...

玛雅牛
2015/08/18
6K
24
给JFinal添加Shiro插件功能,支持Shiro所有注解-实现篇

2015年8月3日更新: 支持JFinal 2.0 版本,同时给出了一些实际代码,想见git @JFinal给出了一些好的建议,已重构部分代码。 代码放在oschina的git上,访问地址: http://git.oschina.net/mya...

玛雅牛
2013/06/12
0
8
Jboot 1.0-rc.3 发布,基于 JFinal 的微服务框架

Jboot是一个基于jfinal、undertow开发的一个类似springboot的开源框架, 我们已经在正式的商业上线项目中使用。到目前为止,Jboot已经支持如下功能: 1、JFinal 核心的自动注入:包含了JFina...

理工男海哥
2017/10/23
1K
8
JFinal 整合 Shiro

最近整合JFinal和Shiro遇到的问题,希望能给你们提示与帮助。 首先,JFinal和Shiro本人都是刚刚接触,JFinal上手很快,但Shiro上手比较费劲,看了很长时间的文档。 下面说一下整合JFinal配置...

leon_rock
2013/06/02
8K
10

没有更多内容

加载失败,请刷新页面

加载更多

如何在10分钟内设置EOS钱包和帐户?

由于SuperNode超级节点社区建立在EOS之上,我们希望引导我们的社区成员设置EOS钱包和帐户,以便充分参与我们的生态系统。 虽然设置过程可能不如其他区块链系统那么简单,但不要担心。本指南旨...

笔阁
8分钟前
0
0
8.04-Win10非U盘重装系统

注意:最好准备一个你所需版本的秘钥(不能是数字0开头的) 【所需:Win10的ISO镜像、能够解压ISO格式的解压缩工具、最好准备你所需版本的秘钥(不能是数字0开头的)】 1、创建新的文件系统为...

静以修身2025
9分钟前
0
0
Docker的架构与自制镜像的发布

一. docker 是什么 大家都知道虚拟机吧,windows 上装个 linux 虚拟机是大部分程序员的常用方案。公司生产环境大多也是虚拟机,虚拟机将物理硬件资源虚拟化,按需分配和使用,虚拟机使用起来...

程序猿拿Q
25分钟前
4
0
ubuntu下pycharm调用Hanlp实践分享

前几天看了大快的举办的大数据论坛峰会的现场直播,惊喜的是hanlp2.0版本发布。Hanlp2.0版本将会支持任意多的语种,感觉还是挺好的!不过更多关于hanlp2.0的信息,可能还需要过一段时间才能看...

左手的倒影
34分钟前
2
0
Python监控服务器实现邮件微信报警[未测试]

本文中笔者暂时实现的只有cpu和内存的监控,python可以监控许多的主机信息,网络,硬盘,机器状态等,以下是代码的实现,代码可以实现windows和linux的监控。 实验环境:Ubuntu16.04和windo...

dragon_tech
39分钟前
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部