Acegi的标签库authzauthorize

简介: 由于前面程序员有用到这个东西,自己又不懂,上网查一篇不能转载,所以就直接cp过来了,希望原作者原谅!在着多谢了11.4.6  使用Acegi的标签库称之为标签库可能有点言过其辞了。
由于前面程序员有用到这个东西,自己又不懂,上网查一篇不能转载,所以就直接cp过来了,希望原作者原谅!在着多谢了
11.4.6  使用Acegi的标签库
称之为标签库可能有点言过其辞了。实际上,Acegi只提供了一个JSP标签:<authz:authorize>标签。
虽然Acegi的安全强制过滤器能够阻止用户浏览他们没有权限看到的页面,但最好的做法是从一开始就不提供指向受限制页面的链接。<authz:authorize>标签能够根据当前用户是否拥有恰当权限来决定显示或隐藏Web页面的内容。
<authz:authorize>是一个流程控制标签,能够在满足特定安全需求的条件下显示它的内容体。它有三个互斥的参数:
n   ifAllGranted――是一个由逗号分隔的权限列表,用户必须拥有所有列出的权限才能渲染标签体;
n   ifAnyGranted――是一个由逗号分隔的权限列表,用户必须至少拥有其中的一个才能渲染标签体;
n   ifNotGranted――是一个由逗号分隔的权限列表,用户必须不拥有其中的任何一个才能渲染标签体。
你可以轻松地想像在JSP中如何使用<authz:authorize>标签根据用户的权限来限制他们的行为。例如,Spring培训应用有一个向用户显示课程有关信息的课程明细页面。对管理员来说,如果能够从课程明细页面直接跳转到课程编辑页面从而可以更新课程信息是很方便的。但你不希望这个链接对除了管理员之外的其他用户可见。
使用<authz:authorize>标签,在用户没有管理员权限的情况下,你可以避免渲染到课程编辑页面的链接:
 
  <authz:authorize ifAllGranted="ROLE_ADMINISTRATOR">   对大小写是敏感的!USER和user是不一样的
    <a href="admin/editCourse.htm?courseId=${course.id}">
      Edit Course
    </a>
  </authz:authorize>
 
这里,我们使用了ifAllGranted参数,由于这里只需要检查一个授权,所以ifAllGranted标签也是可以使用的。Web应用的安全性只是Acegi功能的一个方面。现在让我们考察它的另一面――保护方法调用。
   保护方法调用
虽然Acegi保护Web请求的手段是使用Servlet过滤器,它却是利用Spring对AOP的支持来提供方法级别的声明式保护的。这意味着不是设置一个SecurityEnforcementFilter来强制安全性,而是设置一个Spring AOP代理来拦截方法调用,并将控制转交给安全拦截器。



在有javaScript脚本中有时不方便引用acegi标签,可以从SecurityContextHolder中获得权限集合,然后判断当前登录的用户,其权限集合中是否有某权限,根据判断结果来决定显示或隐藏哪些页面元素,见下面的JSP:
<%@ page contentType="text/html; charset=GBK"%>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
<%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%>
<%@ taglib uri="http://acegisecurity.sf.net/authz" prefix="authz"%>
<%@ page import="org.acegisecurity.Authentication" %>
<%@ page import="org.acegisecurity.context.SecurityContext" %>
<%@ page import="org.acegisecurity.context.SecurityContextHolder" %>
<%@ page import="org.acegisecurity.userdetails.UserDetails" %>
<%@ page import="org.acegisecurity.ui.AccessDeniedHandlerImpl" %>
<%@ page import="org.springframework.aop.framework.ProxyFactoryBean"%>
<%@ page import="org.springframework.context.ApplicationContext"%>
<%@ page import="org.springframework.context.support.ClassPathXmlApplicationContext"%>
<%@ page import="org.acegisecurity.GrantedAuthority"%>
<%@ page import="com.mysoft.common.ValidateAcegiAuth"%>
<%
SecurityContext ctx = SecurityContextHolder.getContext();
%>
。。。
<script language="JavaScript" type="text/javascript">
//下面是调用自定义的类ValidateAcegiAuth,输入当前登录用户的SecurityContext,及权限码,如果有AUTH_FUN_TICKET_CHKERR权限,则执行相应的JS脚本。
<%if(ValidateAcegiAuth.validate(ctx,"AUTH_FUN_TICKET_CHKERR")){%>
//具有AUTH_FUN_TICKET_CHKERR 权限,执行相应js脚本…
<%}%>
</script>
下面是ValidateAcegiAuth类的代码:
package com.mysoft.common;
import org.acegisecurity.Authentication;
import org.acegisecurity.context.SecurityContext;
import org.acegisecurity.context.SecurityContextHolder;
import org.acegisecurity.userdetails.UserDetails;
import org.acegisecurity.ui.AccessDeniedHandlerImpl;
import org.springframework.aop.framework.ProxyFactoryBean;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import org.acegisecurity.GrantedAuthority;

public class ValidateAcegiAuth
{

public static boolean validate(SecurityContext ctxLoginUser,String sAuthID)
{
boolean bool = false;
Authentication authLoginUser = null;
GrantedAuthority[] arrayAuthorities = null;
if(ctxLoginUser!=null)
{
authLoginUser = ctxLoginUser.getAuthentication();
if(authLoginUser!=null)
{
arrayAuthorities = authLoginUser.getAuthorities();
for(int i=0;i<arrayAuthorities.length;i++)
{
if(arrayAuthorities[i].toString().equals(sAuthID))
{
bool = true;
break;
}
}
}
else
{
bool = false;
}
}
else
{
bool = false;
}
return bool;
}
}

目录
相关文章
|
11月前
|
XML SQL Java
JavaWeb--EL表达式&JSTL 标签库
JavaWeb--EL表达式&JSTL 标签库
50 0
|
Java 数据安全/隐私保护
|
XML SQL 存储
【Javaweb】JSP标准标签库
【Javaweb】JSP标准标签库
95 0
【Javaweb】JSP标准标签库
|
SQL XML Oracle
JSTL标签库(JSP标准标签库)
JSTL(JSP Standard Tag Library,核心标签库)是 JSP 标签的集合,它封装了 JSP 应用的通用核心功能。 JSP 标签是一组与 HTML 标签相似,但又比 HTML 标签强大的功能标签。JSTL 用来简化 JSP 开发,可以使我们不用嵌入 Java 代码就能够开发出复杂的 JSP 页面。 JSTL 包含 5 类标签库:core 标签库、fmt 标签库、fn 标签库、XML 标签库和 SQL 标签库。这 5 类标签库基本覆盖了 Web 开发中的所涉及的技术展示。
|
Java
JavaWeb--EL表达式&JSTL 标签库(二)
JavaWeb--EL表达式&JSTL 标签库(二)
78 0
JavaWeb--EL表达式&JSTL 标签库(二)
|
Java
JavaWeb--EL表达式&JSTL 标签库(一)
JavaWeb--EL表达式&JSTL 标签库(一)
79 0
JavaWeb--EL表达式&JSTL 标签库(一)
|
Java API 数据格式
JavaWeb--EL表达式&JSTL 标签库(三)
JavaWeb--EL表达式&JSTL 标签库(三)
125 0
JavaWeb--EL表达式&JSTL 标签库(三)
|
前端开发 Java
Struts2的控制标签库和数据标签库(六)上
Struts2的控制标签库和数据标签库(六)
137 0
Struts2的控制标签库和数据标签库(六)上
|
Java 开发者
Struts2的控制标签库和数据标签库(六)下
Struts2的控制标签库和数据标签库(六)
Struts2的控制标签库和数据标签库(六)下
|
XML Java 应用服务中间件
使用JSP的标准标签库JSTL处理XML格式的数据
使用JSP的标准标签库JSTL处理XML格式的数据
116 0
使用JSP的标准标签库JSTL处理XML格式的数据