`
cowoo
  • 浏览: 48905 次
  • 性别: Icon_minigender_1
社区版块
存档分类

Acegi: Authz标签在有的情况下不起作用

    博客分类:
  • Java
阅读更多
问题描述:Acegi的标签库配置正确,而<authz:authorize..>中ifAllGranted和ifAnyGranted都不起作用,但是ifNotGranted起作用。
解决方法:查看web.xml,把Acegi的Filter调到最前面。比如有sitemesh的filter,也有acegi的,一定要把acegi的放在前面。

今天晚上被Acegi的Tag Library折腾了2个小时。

事情是这样的,本来想用Acegi的标签库来判断用户角色并显示相应的链接,比如说
xml 代码
 
  1. <authz:authorize ifAllGranted="ANONYMOUS">  
  2.   <span><a href="<%=request.getContextPath()%>/jsp/user/register.jsp">注册</a> </span>  
  3.   <span><a href="<%=request.getContextPath()%>/jsp/index.jsp">登录</a> </span>  
  4. </authz:authorize>  
  5. <authz:authorize ifAnyGranted="ADMIN,USER">  
  6.   <span class="last"><a href="<%=request.getContextPath()%>/logout.htm">注销</a> </span>  
  7. </authz:authorize>  


authz的用法就不介绍了,文档讲的比较明白,意思也很明了。上面的代码就是说当当前用户是ANONYMOUS权限的时候,就显示登录和注册链接,当当前用户是管理员或者普通用户的时候,就显示注销链接。

于是在taglib.jsp里面加入了
xml 代码
 
  1. <%@ taglib prefix="authz" uri="http://acegisecurity.org/authz" %>  

就应该可以用啦。但是很奇怪,上面两个好像都不起作用。用ifNotGranted却好用。这就怪了,难道还分方法的?于是把AcegiSecurity的源码找出来,开始追根溯源。

<authz:authorize..>对应的是AuthorizeTag.java,当然,主要是doStartTag方法。基本的逻辑是这样,先获得当前用户的Authentication,然后获得页面中属性的内容,然后比较,如果符合,则显示标签里面的内容,否则跳过标签的内容。

调试看了看,发现页面上的内容都获得到了,但是最后却return Tag.SKIP_BODY;了,那就应该是获得当前用户的Authentication的时候出错了。经过艰难的调试,发现匿名的时候,

java 代码
  1. Authentication currentUser = SecurityContextHolder.getContext().getAuthentication();  


中,currentUser居然是null。而我同时在另一个类里面却能获得ANONYMOUS。又打印SecurityContextHolder.getContext(),也是Null Authentication,无语了,完全一样的用法啊?查了查Acegi的文档,说SecurityContextHolder使用一个ThreadLocal来保存,难道页面的标签库和Spring中的一些类属于不同thread?但是我打印Thread.currentThread又是一样的。。。

后来在spring的论坛上搜索到类似问题,“Authz tags do not work in JSPs under certain condition”(http://forum.springframework.org/showthread.php?t=32189),才找到问题的所在,问题解决人说:

Filter order is important, we know that, it's drummed in by Acegi docs and forum posts left right and centre. But (for me at least) you just focus on the FilterChainProxy. However, before Acegi gets hold of any requests the web.xml must hand them over. Filter order is declared there too and is explicit in the order of your <filter> declarations, so if like me you also have a filter for your action/controller framework, then this must be declared after (below) the Acegi one.

果然,把我在web.xml中的sitemesh的filter放到acegi的filter后面之后,问题就解决了。

至于为什么会导致SecurityContextHolder.getContext()的不同,我想应该是sitemesh先Filter,先走到页面那一块,Authz已经执行了,但这个时候同样的页面还没被Acegi的Filter拦截,所以就出现了上面的问题(个人理解,待验证)。
分享到:
评论
3 楼 囤爷爷 2015-05-13  
[list]
  • [list]
  • [*][list]
  • [*][*][list]
  • [*][*][*][list]
  • [*][*][*][*][list]
  • [*][*][*][*][*][list]
  • [*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][img]
    引用
    [u][i][b][/b][/i][/u]
    [/img]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][*][/list]
  • [*][*][*][*][*][*][/list]
  • [*][*][*][*][*][/list]
  • [*][*][*][*][/list]
  • [*][*][*][/list]
  • [*][*][/list]
  • [*][/list]
  • [/list]
  • [/list]
    2 楼 grantgreat 2007-06-09  
    问:
    哪里有acegi标签下载,哪里有这个例子
    1 楼 arbrrrr 2007-05-31  
    您好,,对JAVA也不是很熟悉我发生的情况跟你一样,但是我只有一个filter,还是有问题,请看我的web.xml


    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">

    <!--
      - Contacts web application
      -
      - web.xml for "filter" artifact only.
      -
      - $Id: web.xml 1513 2006-05-29 13:32:12Z benalex $
      -->
    <web-app>
      <display-name>Acegi Security Tutorial Application</display-name>
      <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:applicationContext-hibernate.xml
    /WEB-INF/applicationContext-acegi-security.xml</param-value>
      </context-param>
      <filter>
        <filter-name>Acegi Filter Chain Proxy</filter-name>
        <filter-class>org.acegisecurity.util.FilterToBeanProxy</filter-class>
        <init-param>
          <param-name>targetClass</param-name>
          <param-value>org.acegisecurity.util.FilterChainProxy</param-value>
        </init-param>
      </filter>
      <filter-mapping>
        <filter-name>Acegi Filter Chain Proxy</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      <!--
      - Loads the root application context of this web app at startup.
      - The application context is then available via
      - WebApplicationContextUtils.getWebApplicationContext(servletContext).
        -->
      <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
      </listener>
      <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <init-param>
          <param-name>debug</param-name>
          <param-value>3</param-value>
        </init-param>
        <init-param>
          <param-name>detail</param-name>
          <param-value>3</param-value>
        </init-param>
        <load-on-startup>0</load-on-startup>
      </servlet>
      <servlet>
    <servlet-name>freemarker</servlet-name>
    <servlet-class>
    freemarker.ext.servlet.FreemarkerServlet
    </servlet-class>
    <init-param>
    <param-name>TemplatePath</param-name>
    <param-value>/</param-value>
    </init-param>
    <init-param>
    <param-name>NoCache</param-name>
    <param-value>true</param-value>
    </init-param>
    <init-param>
    <param-name>ContentType</param-name>
    <param-value>text/html</param-value>
    </init-param>
    <init-param>
    <param-name>template_update_delay</param-name>
    <param-value>0</param-value>
    </init-param>
    <init-param>
    <param-name>default_encoding</param-name>
    <param-value>UTF-8</param-value>
    </init-param>
    <init-param>
    <param-name>locale</param-name>
    <param-value>en_US</param-value>
    </init-param>
    <init-param>
    <param-name>number_format</param-name>
    <param-value>0.##########</param-value>
    </init-param>
    <load-on-startup>1</load-on-startup>
    </servlet>
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
       <servlet-mapping>
    <servlet-name>freemarker</servlet-name>
    <url-pattern>*.ftl</url-pattern>
    </servlet-mapping>
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

     

    相关推荐

      实战Acegi:使用Acegi作为基于Spring框架的WEB应

      尽管如此,了解Acegi Security对于理解Spring Security的原理和机制仍然非常有帮助。 在实际的项目中,我们还需要处理一些其他安全问题,如CSRF(跨站请求伪造)防护、XSS(跨站脚本攻击)防护以及输入验证等。...

      实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架

      Acegi是一个专门为SpringFramework应用提供安全机制的开放源代码项目,全称为Acegi Security System for Spring,当前版本为 0.8.3。它使用了Spring的方式提供了安全和认证安全服务,包括使用Bean Context,拦截器和...

      实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf

      《实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架》这本书提供了一个很好的起点,它详细介绍了如何设置和使用Acegi,以及如何解决实际开发中的安全问题。 总的来说,Acegi为基于Spring的Web应用提供...

      实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.rar

      Acegi是Spring Security的前身,它是一个强大的、可...尽管Acegi已被Spring Security所取代,但其核心理念和使用方法在Spring Security中仍然得到延续,因此学习Acegi对于理解Spring Security的安全机制非常有帮助。

      acegi

      虽然在Spring 3.0之后,Acegi 被Spring Security所取代,但其在当时对Spring社区的贡献是不可忽视的。 1. **Acegi Security的核心概念** - **身份验证(Authentication)**:Acegi 提供了多种身份验证机制,如基于...

      acegi-security-taglib-0.51.jar.zip

      Acegi Security Taglib 提供了一系列的标签,例如`&lt;acegi:authentication&gt;`用于处理用户身份验证,`&lt;acegi:access&gt;`用于定义访问控制等。 在使用`acegi-security-taglib-0.51.jar`时,首先需要将其添加到项目类路径...

      基于java的ACEGI

      在《实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf》中,可能会详细讲解如何配置和使用Acegi。以下是一些关键步骤: 1. **添加依赖**:首先,在项目中引入Acegi的依赖库,通常是通过Maven或...

      Acegi框架介绍 acegi安全与认证

      尽管现在Spring Security已经成为更推荐的安全解决方案,但Acegi在早期对Spring应用的安全支持起到了重要作用,其设计理念和实现方式在Spring Security中得到了继承和发展。 总的来说,Acegi Security(Spring ...

      acegi安全策略与CAS整合

      - AceGI:AceGi Security,一个用于Spring Web应用的安全框架。 - CAS:Central Authentication Service,中心认证服务,提供单一登录解决方案。 - SSO:Single Sign-On,单点登录,用户只需登录一次就能访问所有...

      ACEGI

      这个框架解决了J2EE规范中安全性配置不便于移植的问题,使得应用程序的安全设置能够在不同服务器环境下轻松迁移。Acegi Security的核心设计考虑了认证(Authentication)和授权(Authorization)这两个关键的安全...

      权限Acegi的使用

      在实际应用中,我们通常会遵循以下步骤来使用Acegi: 1. **集成Acegi**:将Acegi库添加到项目的类路径中,并在Spring配置文件中声明Acegi的安全配置。 2. **配置安全上下文**:定义安全上下文,指定认证和授权的...

      敏捷Acegi、CAS构建安全的Java系统(part2)共四part

      JAVA开发专家:敏捷Acegi、CAS:构建安全的Java系统 pdf

      Acegi例子代码+一个很好的学习Acegi的网址

      2. **授权(Authorization)**:在Acegi中,授权是指确定一个已认证的用户是否有权限访问特定的资源或执行某些操作。它可以基于角色、URL、方法或者更复杂的规则进行控制。 3. **会话管理(Session Management)**...

      使用Acegi作为基于Spring框架的WEB应用的安全框架

      "实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf"这份文档详细讲解了如何在实际项目中部署和使用Acegi Security。内容可能包括: - 安装和设置Acegi Security库。 - 创建自定义认证和授权逻辑。 - ...

      Acegi-spring安全框架

      Acegi框架的这种设计使安全控制变得简单且灵活,能够在不侵入业务代码的情况下实现安全策略。然而,尽管Acegi非常强大,它也有不足之处,如学习曲线较陡峭,配置复杂,对于初学者来说可能较为困难。此外,随着Spring...

      spring acegi 详细文档

      如果你手头有Acegi的详细文档,如acegi.docx和Acegi.zip中的内容,这将是一个宝贵的资源,帮助你深入理解和解决问题。 总结起来,Spring Acegi是一个强大的安全框架,它的功能包括用户认证、权限控制和安全拦截。...

      菜鸟-手把手教你把Acegi应用到实际项目中(1.2)

      在实际项目中,你需要完成以下步骤来集成Acegi: 1. **添加依赖**:首先,在你的项目中引入Acegi的相关库。如果是Maven项目,你需要在pom.xml文件中添加对应的依赖项。 2. **配置Acegi**:在Spring配置文件中定义...

      Acegi(四):Acegi初体验及初解剖

      尽管Acegi已经被Spring Security所取代,但它的设计理念和核心功能对理解现代Java应用安全依然有价值。 首先,Acegi提供了身份验证和授权服务,确保只有合法用户能够访问应用程序的特定部分。在初体验部分,博主...

      acegi_help.zip_Help!_acegi

      "实战Acegi:使用Acegi作为基于Spring框架的WEB应用的安全框架.pdf"这份文档很可能详细阐述了如何将Acegi Security整合到Spring应用中,提供了从基础到高级的实践指南。它可能涵盖的内容包括但不限于: 1. **Acegi ...

      acegi 完整实例

      1. **匿名登录**:Acegi允许用户在不提供详细认证信息的情况下访问特定资源。这通常用于提供公共信息或服务,如网站的首页。通过配置Acegi,可以定义哪些URL允许匿名访问,哪些需要身份验证。 2. **Session管理**:...

    Global site tag (gtag.js) - Google Analytics