即时认证是指,用户进行查询或更新操作时,判断该用户进行是否对该操作有权限。

这里以判断用户是否有删除权限为例。如果用户有删除权限,即显示该按钮;如果没有删除权限,则不显示该按钮。

1、Manager层的即时认证方法。这里是具体实现即时认证的过程。

package com.lzq.manager.impl;

import java.util.Iterator;
import java.util.List;
import com.lzq.model.ACL; /**
* 认证管理
* @author lzq
*
*/
public class ACLManager extends AbstractPageManager {
/**
* 即时认证
* 判断用户对某模块的某操作的授权(允许或不允许)
* @param userId 用户标识
* @param resourceSn 资源标识
* @param permission 权限(C/R/U/D)
* @return 允许(true)或不允许(false)
*/
public boolean hasPermission(int userId, int resourceSn, int permission) {
Boolean flag =false;
//查找直接授予用户的授权
ACL acl = findACL(ACL.TYPE_USER, userId, resourceSn);
if (acl != null) {
int yesOrNo = acl.getPermission(permission);
//如果是确定的授权
if (yesOrNo != ACL.ACL_NEUTRAL ) {
flag = yesOrNo == ACL.ACL_YES ? true:false;
return flag;
}
}
//继续查找用户的角色授权
String hql = "select r.id from UsersRoles ur join ur.role r join ur.user u where u.id =? order by ur.orderNo";
List aclIds =getHibernateTemplate().find(hql, userId);
//依照角色优先级依次查找其授权
for (Iterator iter = aclIds.iterator(); iter.hasNext();) {
Integer rid = (Integer) iter.next();
acl =findACL(ACL.TYPE_ROLE, rid, resourceSn); //一旦发现授权,即刻返回结果
if (acl != null) {
flag = acl.getPermission(permission) == acl.ACL_YES ? true: false;
return flag;
}
}
return flag;
} public boolean hasPermissionBySn(int userId, String resourceSn,
int permission) {
String hql ="select m.id from Module m where m.sn = ? ";
return hasPermission(userId,
(Integer)getSession().createQuery(hql).setParameter(0, resourceSn).uniqueResult(),
permission);
}
/**
* 根据主体类型、主体标识、资源标识查找ACL实例
* @param principalType
* @param principalSn
* @param resourceSn
* @param permission
* @return
*/
private ACL findACL(String principalType, int principalSn,int resourceSn){
String strSql ="select acl from ACL acl where acl.principalType = ? and acl.principalSn = ? and acl.resourceSn = ?";
ACL acl =(ACL)getSession().createQuery(strSql)
.setParameter(0, principalType)
.setParameter(1, principalSn)
.setParameter(2, resourceSn)
.uniqueResult();
return acl;
}
}

2、定义实现JSTL即时认证的java类,由于程序启动时就要将其加载到内存,该方法必须定义成static类型。

package com.lzq.web;

import com.lzq.manager.ACLManager;

/**
* JSTL函数,主要功能是可以完成权限的即时认证
* @author lzq
*
*/
public class SecurityFunctions {
private static ACLManager aclManager; //这个方法不能定义为static,因为这样导致spring无法注入
public void setAclManager(ACLManager aclManager) {
SecurityFunctions.aclManager = aclManager;
}
public static boolean hasPermission(int userId,String resourceSn,int permission){
return aclManager.hasPermissionBySn(userId, resourceSn, permission);
}
}

3、在web-inf下面新建如下my.tld文件。这里要仿照JSTL标签库里面的tld文件进行编写。

<?xml version="1.0" encoding="UTF-8" ?>

<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.1</tlib-version>
<short-name>my</short-name>
<uri>http://www.lzq.com/functions</uri>
<function>
<name>hasPermission</name>
<function-class>com.lzq.web.SecurityFunctions</function-class>
<function-signature>boolean hasPermission(int, java.lang.String,int)</function-signature>
<example>
<c:if test="${fn:contains(name, searchString)}">
</example>
</function>
</taglib>

4、在web.xml文件里面进行注册

  <!--JSTL注册自定义函数:注册自己编写的方法  -->
<jsp-config>
<taglib>
<taglib-uri>http://www.lzq.com/functions</taglib-uri>
<taglib-location>/WEB-INF/my.tld</taglib-location>
</taglib>
</jsp-config>

5、进行即时认证操作

<c:if test="${my:hasPermission(login.id,'person',3) }">
<td align="center">
<a href="#" onclick="del('person.do?command=del&id=${person.id}')">删除</a>
</td>
</c:if>

通过动态控制是否显示删除按钮,来控制用户是否有删除的权限。

JSTL自定义函数完成ACL即时认证的更多相关文章

  1. JavaWeb学习之JSTL自定义标签库的使用、JSTL自定义函数库(7)

    一.自定义标签,步骤 * 确定需求 * <my:date /> 输出当前系统的时间 yyyy-MM-dd hh:mm:ss:SSS * 编写Java类 新建包名:com.yxl.tag,新 ...

  2. 权限管理之基于ACL的实现:自定义JSTL函数实现即时认证

    实现即时认证(即只有拥有相应的权限,才能做相应的操作) 经常用在,在JSP页面上,调用JSTL自定义函数做判断,显示相应的菜单或者功能按钮,比如只有管理员登陆时才显示“删除”按钮,从而完成权限的即时认 ...

  3. [应用篇]第六篇 JSTL之自定义函数标签库

      在之前的JSTL的总结中已经对函数标签库进行了一些说明,在这里我再一次重新整理一下! 自带函数标签库介绍 引入该标签库的方法为: <%@ taglib prefix="fn&quo ...

  4. 自定义函数标签(JSTL)

    创建自定义函数标签步骤: 1.创建类,并且方法只能是静态 public static void operation(calculator cal) 2.书写tld <taglib xmlns=& ...

  5. JSP第四篇【EL表达式介绍、获取各类数据、11个内置对象、执行运算、回显数据、自定义函数、fn方法库】

    什么是EL表达式? 表达式语言(Expression Language,EL),EL表达式是用"${}"括起来的脚本,用来更方便的读取对象! EL表达式主要用来读取数据,进行内容的 ...

  6. jquary 单选,多选,select 获取和设置值 jquary自定义函数

    <%@ page contentType="text/html; charset=UTF-8"%> <%@ taglib prefix="c" ...

  7. ACL登陆认证

    前篇文章ACL授权实例介绍了授权,授权完成之后,就要进行认证.ACL的认证主要分为登陆认证与即时认证.所谓登录认证就是在用户登陆的时候,进行信息认证.根据用户Id,加载上来该用户所拥有的权限模块:而即 ...

  8. T-SQL 之 自定义函数

    和存储过程很相似,用户自定义函数也是一组有序的T-SQL语句,UDF被预先优化和编译并且作为一个单元进行调用.UDF和存储过程的主要区别在于返回结果的方式. 使用UDF时可传入参数,但不可传出参数.输 ...

  9. javaweb之EL自定义函数

    1.什么是EL自定义函数 EL自定义函数是在EL表达式中调用的某个java类的静态方法,这个静态方法需在web应用程序中进行配置才可以被EL表达式调用.EL自定义函数可以扩展EL表达式的功能,让EL表 ...

随机推荐

  1. oracle 文件系统

    oracle数据文件信息 select * from v$datafile;--查看数据文件信息select * from v$controlfile;--查看控制文件信息 一.控制文件(Contro ...

  2. Ansiable Manage MySQL global variables

    mysql_variables - Manage MySQL global variables New in version 1.3. Synopsis Requirements (on host t ...

  3. dubbo通信协议

    对dubbo的协议的学习,可以知道目前主流RPC通信大概是什么情况,本文参考dubbo官方文档 http://dubbo.io/User+Guide-zh.htm dubbo共支持如下几种通信协议: ...

  4. cdoj第13th校赛初赛H - Hug the princess

    http://acm.uestc.edu.cn/#/contest/show/54 H - Hug the princess Time Limit: 3000/1000MS (Java/Others) ...

  5. 300最长上升子序列 · Longest Increasing Subsequence

    [抄题]: 往上走台阶 最长上升子序列问题是在一个无序的给定序列中找到一个尽可能长的由低到高排列的子序列,这种子序列不一定是连续的或者唯一的. 样例 给出 [5,4,1,2,3],LIS 是 [1,2 ...

  6. mvc下ajax请求遇到session超时简单处理方式

    转自:http://blog.csdn.net/yeyicsdn/article/details/50032787 参考网址:http://www.cnblogs.com/RachelChen/p/5 ...

  7. SNP/单核苷酸多态性分析

    SNP/单核苷酸多态性分析 SNP(Single Nucleotide Polymorphism),即单核苷酸多态性,是由于单个核苷酸改变而导致的核酸序列多态.一般来说,一个SNP位点只有两种等位基因 ...

  8. 11月11日光棍节考试总结hhh

    好吧,第一题字符串裸栈就能A 第二题字典序没调完,先写的第一题和第三题暴力,第二题读题感觉自己不会写,其实也能写出来,浪费了好多时间 第三题DP大概是写的暴力,原本可以搞到20分,要交的时候发现自己少 ...

  9. DB2自增长ID

    建议类似的应用采用sequence对象,将来的应用维护和数据迁移会很方便.考虑的因素较少. 对于序列可以使用nextval和prevval来获得下一个和上一个值:CREATE SEQUENCE seq ...

  10. 【Jsoup】Jsoup解析Html标签(Java后台解析)

    中文API网站(下载地址): http://www.open-open.com/jsoup/ 有时候编辑器传到后台的内容是带Html标签的,或者有时候需要形成一个完整的Html文档,也或者需要解析其中 ...