由于前面程序员有用到这个东西,自己又不懂,上网查一篇不能转载,所以就直接cp过来了,希望原作者原谅!在着多谢了
11.4.6<wbr> 使用Acegi的标签库<br> 称之为标签库可能有点言过其辞了。实际上,Acegi只提供了一个JSP标签:<authz:authorize>标签。<br> 虽然Acegi的安全强制过滤器能够阻止用户浏览他们没有权限看到的页面,但最好的做法是从一开始就不提供指向受限制页面的链接。<authz:authorize>标签能够根据当前用户是否拥有恰当权限来决定显示或隐藏Web页面的内容。<br> <authz:authorize>是一个流程控制标签,能够在满足特定安全需求的条件下显示它的内容体。它有三个互斥的参数:<br> n<wbr><wbr> ifAllGranted――是一个由逗号分隔的权限列表,用户必须拥有所有列出的权限才能渲染标签体;<br> n<wbr><wbr> ifAnyGranted――是一个由逗号分隔的权限列表,用户必须至少拥有其中的一个才能渲染标签体;<br> n<wbr><wbr> ifNotGranted――是一个由逗号分隔的权限列表,用户必须不拥有其中的任何一个才能渲染标签体。<br> 你可以轻松地想像在JSP中如何使用<authz:authorize>标签根据用户的权限来限制他们的行为。例如,Spring培训应用有一个向用户显示课程有关信息的课程明细页面。对管理员来说,如果能够从课程明细页面直接跳转到课程编辑页面从而可以更新课程信息是很方便的。但你不希望这个链接对除了管理员之外的其他用户可见。<br> 使用<authz:authorize>标签,在用户没有管理员权限的情况下,你可以避免渲染到课程编辑页面的链接:<br><wbr><br><wbr> <authz:authorize ifAllGranted="ROLE_ADMINISTRATOR"><wbr><wbr> 对大小写是敏感的!USER和user是不一样的<br><wbr><wbr><wbr> <a href="admin/editCourse.htm?courseId=${course.id}"><br><wbr><wbr><wbr><wbr><wbr> Edit Course<br><wbr><wbr><wbr> </a><br><wbr> </authz:authorize><br><wbr><br> 这里,我们使用了ifAllGranted参数,由于这里只需要检查一个授权,所以ifAllGranted标签也是可以使用的。Web应用的安全性只是Acegi功能的一个方面。现在让我们考察它的另一面――保护方法调用。<br><wbr><wbr> 保护方法调用<br> 虽然Acegi保护Web请求的手段是使用Servlet过滤器,它却是利用Spring对AOP的支持来提供方法级别的声明式保护的。这意味着不是设置一个SecurityEnforcementFilte<wbr>r来强制安全性,而是设置一个Spring AOP代理来拦截方法调用,并将控制转交给安全拦截器。<br><br><br><br> 在有javaScript脚本中有时不方便引用acegi标签,可以从SecurityContextHolder中获得权限集合,然后判断当前登录的用户,其权限集合中是否有某权限,根据判断结果来决定显示或隐藏哪些页面元素,见下面的JSP:<br> <%@ page contentType="text/html; charset=GBK"%><br> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><br> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><br> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%><br> <%@ taglib uri="http://acegisecurity.sf.net/authz" prefix="authz"%><br> <%@ page import="org.acegisecurity.Authentication" %><br> <%@ page import="org.acegisecurity.context.SecurityContext" %><br> <%@ page import="org.acegisecurity.context.SecurityContextHolder" %><br> <%@ page import="org.acegisecurity.userdetails.UserDetails" %><br> <%@ page import="org.acegisecurity.ui.AccessDeniedHandlerImpl" %><br> <%@ page import="org.springframework.aop.framework.ProxyFactoryBean"%><br> <%@ page import="org.springframework.context.ApplicationContext"%><br> <%@ page import="org.springframework.context.support.ClassPathXmlApplicationC<wbr>ontext"%><br> <%@ page import="org.acegisecurity.GrantedAuthority"%><br> <%@ page import="com.mysoft.common.ValidateAcegiAuth"%><br> <%<br> SecurityContext ctx = SecurityContextHolder.getContext();<br> %><br> 。。。<br> <script language="JavaScript" type="text/javascript"><br> //下面是调用自定义的类ValidateAcegiAuth,输入当前登录用户的SecurityContext,及权限码,如果有AUTH_FUN_TICKET_CHKERR权限,则执行相应的JS脚本。<br> <%if(ValidateAcegiAuth.validate(ctx,"AUTH_FUN_TICKET_CHKERR")){%><br> //具有AUTH_FUN_TICKET_CHKERR 权限,执行相应js脚本…<br> <%}%><br> </script><br> 下面是ValidateAcegiAuth类的代码:<br> package com.mysoft.common;<br> import org.acegisecurity.Authentication;<br> import org.acegisecurity.context.SecurityContext;<br> import org.acegisecurity.context.SecurityContextHolder;<br> import org.acegisecurity.userdetails.UserDetails;<br> import org.acegisecurity.ui.AccessDeniedHandlerImpl;<br> import org.springframework.aop.framework.ProxyFactoryBean;<br> import org.springframework.context.ApplicationContext;<br> import org.springframework.context.support.ClassPathXmlApplicationC<wbr>ontext;<br> import org.acegisecurity.GrantedAuthority;<br><br> public class ValidateAcegiAuth<br> {<br><br> public static boolean validate(SecurityContext ctxLoginUser,String sAuthID)<br> {<br> boolean bool = false;<br> Authentication authLoginUser = null;<br> GrantedAuthority[] arrayAuthorities = null;<br> if(ctxLoginUser!=null)<br> {<br> authLoginUser = ctxLoginUser.getAuthentication();<br> if(authLoginUser!=null)<br> {<br> arrayAuthorities = authLoginUser.getAuthorities();<br> for(int i=0;i<arrayAuthorities.length;i++)<br> {<br> if(arrayAuthorities[i].toString().equals(sAuthID))<br> {<br> bool = true;<br> break;<br> }<br> }<br> }<br> else<br> {<br> bool = false;<br> }<br> }<br> else<br> {<br> bool = false;<br> }<br> return bool;<br> }<br> }<br><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>
11.4.6<wbr> 使用Acegi的标签库<br> 称之为标签库可能有点言过其辞了。实际上,Acegi只提供了一个JSP标签:<authz:authorize>标签。<br> 虽然Acegi的安全强制过滤器能够阻止用户浏览他们没有权限看到的页面,但最好的做法是从一开始就不提供指向受限制页面的链接。<authz:authorize>标签能够根据当前用户是否拥有恰当权限来决定显示或隐藏Web页面的内容。<br> <authz:authorize>是一个流程控制标签,能够在满足特定安全需求的条件下显示它的内容体。它有三个互斥的参数:<br> n<wbr><wbr> ifAllGranted――是一个由逗号分隔的权限列表,用户必须拥有所有列出的权限才能渲染标签体;<br> n<wbr><wbr> ifAnyGranted――是一个由逗号分隔的权限列表,用户必须至少拥有其中的一个才能渲染标签体;<br> n<wbr><wbr> ifNotGranted――是一个由逗号分隔的权限列表,用户必须不拥有其中的任何一个才能渲染标签体。<br> 你可以轻松地想像在JSP中如何使用<authz:authorize>标签根据用户的权限来限制他们的行为。例如,Spring培训应用有一个向用户显示课程有关信息的课程明细页面。对管理员来说,如果能够从课程明细页面直接跳转到课程编辑页面从而可以更新课程信息是很方便的。但你不希望这个链接对除了管理员之外的其他用户可见。<br> 使用<authz:authorize>标签,在用户没有管理员权限的情况下,你可以避免渲染到课程编辑页面的链接:<br><wbr><br><wbr> <authz:authorize ifAllGranted="ROLE_ADMINISTRATOR"><wbr><wbr> 对大小写是敏感的!USER和user是不一样的<br><wbr><wbr><wbr> <a href="admin/editCourse.htm?courseId=${course.id}"><br><wbr><wbr><wbr><wbr><wbr> Edit Course<br><wbr><wbr><wbr> </a><br><wbr> </authz:authorize><br><wbr><br> 这里,我们使用了ifAllGranted参数,由于这里只需要检查一个授权,所以ifAllGranted标签也是可以使用的。Web应用的安全性只是Acegi功能的一个方面。现在让我们考察它的另一面――保护方法调用。<br><wbr><wbr> 保护方法调用<br> 虽然Acegi保护Web请求的手段是使用Servlet过滤器,它却是利用Spring对AOP的支持来提供方法级别的声明式保护的。这意味着不是设置一个SecurityEnforcementFilte<wbr>r来强制安全性,而是设置一个Spring AOP代理来拦截方法调用,并将控制转交给安全拦截器。<br><br><br><br> 在有javaScript脚本中有时不方便引用acegi标签,可以从SecurityContextHolder中获得权限集合,然后判断当前登录的用户,其权限集合中是否有某权限,根据判断结果来决定显示或隐藏哪些页面元素,见下面的JSP:<br> <%@ page contentType="text/html; charset=GBK"%><br> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %><br> <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %><br> <%@ taglib uri="/WEB-INF/struts-logic.tld" prefix="logic"%><br> <%@ taglib uri="http://acegisecurity.sf.net/authz" prefix="authz"%><br> <%@ page import="org.acegisecurity.Authentication" %><br> <%@ page import="org.acegisecurity.context.SecurityContext" %><br> <%@ page import="org.acegisecurity.context.SecurityContextHolder" %><br> <%@ page import="org.acegisecurity.userdetails.UserDetails" %><br> <%@ page import="org.acegisecurity.ui.AccessDeniedHandlerImpl" %><br> <%@ page import="org.springframework.aop.framework.ProxyFactoryBean"%><br> <%@ page import="org.springframework.context.ApplicationContext"%><br> <%@ page import="org.springframework.context.support.ClassPathXmlApplicationC<wbr>ontext"%><br> <%@ page import="org.acegisecurity.GrantedAuthority"%><br> <%@ page import="com.mysoft.common.ValidateAcegiAuth"%><br> <%<br> SecurityContext ctx = SecurityContextHolder.getContext();<br> %><br> 。。。<br> <script language="JavaScript" type="text/javascript"><br> //下面是调用自定义的类ValidateAcegiAuth,输入当前登录用户的SecurityContext,及权限码,如果有AUTH_FUN_TICKET_CHKERR权限,则执行相应的JS脚本。<br> <%if(ValidateAcegiAuth.validate(ctx,"AUTH_FUN_TICKET_CHKERR")){%><br> //具有AUTH_FUN_TICKET_CHKERR 权限,执行相应js脚本…<br> <%}%><br> </script><br> 下面是ValidateAcegiAuth类的代码:<br> package com.mysoft.common;<br> import org.acegisecurity.Authentication;<br> import org.acegisecurity.context.SecurityContext;<br> import org.acegisecurity.context.SecurityContextHolder;<br> import org.acegisecurity.userdetails.UserDetails;<br> import org.acegisecurity.ui.AccessDeniedHandlerImpl;<br> import org.springframework.aop.framework.ProxyFactoryBean;<br> import org.springframework.context.ApplicationContext;<br> import org.springframework.context.support.ClassPathXmlApplicationC<wbr>ontext;<br> import org.acegisecurity.GrantedAuthority;<br><br> public class ValidateAcegiAuth<br> {<br><br> public static boolean validate(SecurityContext ctxLoginUser,String sAuthID)<br> {<br> boolean bool = false;<br> Authentication authLoginUser = null;<br> GrantedAuthority[] arrayAuthorities = null;<br> if(ctxLoginUser!=null)<br> {<br> authLoginUser = ctxLoginUser.getAuthentication();<br> if(authLoginUser!=null)<br> {<br> arrayAuthorities = authLoginUser.getAuthorities();<br> for(int i=0;i<arrayAuthorities.length;i++)<br> {<br> if(arrayAuthorities[i].toString().equals(sAuthID))<br> {<br> bool = true;<br> break;<br> }<br> }<br> }<br> else<br> {<br> bool = false;<br> }<br> }<br> else<br> {<br> bool = false;<br> }<br> return bool;<br> }<br> }<br><br></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr></wbr>