意思就是只有具有相应权限的用户才能打开相应的url, 这个应该怎么配置,哪位能给个例子?下面的代码能不能做到访问/writeAction.do的时候要求具有ROLE_WRITER?能不能给分析一下 <bean id="methodDefinitionSourceAdvisor"
class="org.acegisecurity.intercept.method.aopalliance.MethodDefinitionSourceAdvisor">
<constructor-arg>
<bean
class="org.acegisecurity.intercept.method.aopalliance.MethodSecurityInterceptor">
<property name="authenticationManager">
<ref bean="authenticationManager" />
</property>
<property name="accessDecisionManager">
<ref bean="methodAccessDecisionManager" />
</property>
<property name="objectDefinitionSource">
<value> com.xxx.WriteAction.execute=ROLE_WRITER

</value>
</property>
</bean>
</constructor-arg>
</bean>

解决方案 »

  1.   

    关于那个role
    类似ROLE_WRITER, 可以在properties文件,或者数据库里定义的吧,有没有使用数据库的例子,user表应该是怎么定义的?role是怎么拿的?
      

  2.   

    如果楼主想自己获得数据表定义的角色,需要自己实现acegi的接口,我水平比楼主要差很多,楼主要是愿意不耻下问,可以给我留邮箱
      

  3.   


    believefym1161#163.com
      

  4.   

    没人回再问一下: 对于没有权限访问之后,能不能返回到当前页面,并嵌入一些errormessage,类似于struts的errormessage貌似现在我这边还只能返回到另外一张AccessDenied页面,或者没有配置过的话,也会自动出来下面的信息谁提供点资料。
      

  5.   


    在authenticationProcessingFilter中加入如下属性:
    <property name="exceptionMappings">
      <props>
        <prop key="org.acegisecurity.BadCredentialsException">/XXX.jsp</prop>
        <prop key="org.acegisecurity.DisabledException">/YYY.jsp</prop>
      </props>
    </property>资料的话,可以看看 罗时飞 的《敏捷acegi、cas 构建安全的java系统》
      

  6.   

    这些url应该保存在数据库表中,然后跟你的用户组表应该有个关联表,记录用户组下的用户可以访问哪些资源
      

  7.   

    spring security有个投票器,你要定义一个自己的投票,查看当前的url是否被当前用户所在的组容许访问
      

  8.   


    <prop key="org.acegisecurity.BadCredentialsException">/XXX.jsp </prop>
    我现在也是类似这样配置的,但是这样的话,XXX.jsp将作为所有没有相应权限而去访问资源后的跳转页面比如我想访问a.jsp, 如果没有相应的权限,则仍然能到a.jsp,但是只是在页面上提示说没有权限,而不在页面上显示相应的业务数据不知道acegi能不能实现这样定制的功能,感觉好像这个框架不太好实现这样的需求,求证一下
      

  9.   

    1.一般来讲acegi的权限限制都是靠正则表达式来限制的,例如  <bean id="filterInvocationInterceptor"
        class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
        <property name="authenticationManager">
          <ref local="authenticationManager" />
        </property>
        <property name="accessDecisionManager">
          <ref local="httpRequestAccessDecisionManager" />
        </property>
        <property name="objectDefinitionSource">
          <value>
            <![CDATA[
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    \A/welcome/.*\Z=Anonymous,Authenticated
    \A/public/.*\Z=Anonymous,Authenticated
    \A/login.*\Z=Anonymous,Authenticated
    \A/ping/alive.gif.*\Z=Anonymous,Authenticated
    \A/j_acegi_security_check.*\Z=Anonymous,Authenticated
    \A/getmondrianmodel.*\Z=Anonymous,Authenticated
    \A/getimage.*\Z=Anonymous,Authenticated
    \A/getresource.*\Z=Anonymous,Authenticated
    \A/admin.*\Z=Admin
    \A/auditreport.*\Z=Admin
    \A/auditreportlist.*\Z=Admin
    \A/versioncontrol.*\Z=Admin
    \A/propertieseditor.*\Z=Admin
    \A/propertiespanel.*\Z=Admin
    \A/subscriptionadmin.*\Z=Admin
    \A/resetrepository.*\Z=Admin
    \A/viewaction.*solution.admin.*\Z=Admin
    \A/scheduleradmin.*\Z=Admin
    \A/publish.*\Z=Admin
    \A/logout.*\Z=Anonymous
    \A/.*\Z=Authenticated
            ]]>
          </value>
        </property>
      </bean>
    像你的那个就可以写成 <bean id="filterInvocationInterceptor"
        class="org.acegisecurity.intercept.web.FilterSecurityInterceptor">
        <property name="authenticationManager">
          <ref local="authenticationManager" />
        </property>
        <property name="accessDecisionManager">
          <ref local="httpRequestAccessDecisionManager" />
        </property>
        <property name="objectDefinitionSource">
          <value>
            <![CDATA[
    CONVERT_URL_TO_LOWERCASE_BEFORE_COMPARISON
    \A/writeAction.do/.*\Z=ROLE_WRITER
            ]]>
          </value>
        </property>
      </bean>URL的写法你再推敲下,Struts我用的不多,2.想用数据库验证的话你要将验证方式修改一下  <bean id="authenticationManager"
        class="org.acegisecurity.providers.ProviderManager">
        <property name="providers">
          <list>
            <ref bean="daoAuthenticationProvider" />
          </list>
        </property>
      </bean>  <bean id="daoAuthenticationProvider"
    class="org.acegisecurity.providers.dao.DaoAuthenticationProvider">
         <property name="authenticationDao">
            <ref bean="authenticationDao"/>
         </property>
      </bean>  <bean id="authenticationDao"
         class="org.acegisecurity.providers.dao.jdbc.JdbcDaoImpl">
         <property name="dataSource">
            <ref bean="dataSource"/>
         </property>
         <property name="usersByUserNameQuery">         <!--确认用户存在-->
            <value>SELECT login, password FROM student WHERE login=?</value>
         </property>
         <property name=”authoritiesByUserNameQuery”> <!--获得角色-->
            <value>SELECT login, privilege FROM user_privileges where login=?</value>
         </property>
      </bean>
    3.acegi是利用了URL过滤机制实现,所以配置自然也要在过滤器的配置文件里了
      

  10.   

    当IE用户初次访问受保护的Web资源时,ExceptionTranslationFilter过滤器会捕捉到AccessDeniedException异常,此时,它会调用自身的sendStartAuthentication()方法。它构建SavedRequest对象,并将httpRequest请求保存到其中。随后,将savedRequest对象保存在ACEGI_SAVED_REQUEST_KEY属性中。
    一旦AuthenticationProcessingFilter成功认证用户,这一过滤器便会调用自身的
    sucessfulAuthentication方法,去HttpSession的ACEGI_SAVED_REQUEST_KEY属性中查找SavedRequest对象,从而返回给IE客户之前的URL信息。上面是从书上帮你抄的,它没说认证失败后如何获得SavedRequest对象,不过应该是可以的,LZ自己想想办法,哈~
      

  11.   


    能不能为不同的页面定制不同的无权限后的跳转页面
    比如, 没有相应的权限访问a.jsp后跳转到a_error.jsp,
    访问b.jsp后跳转到b_error.jsp,而不是像上面配置文件那样统一跳转到XXX.jsp
      

  12.   

    我帖子太冷清了 来插个广告 关于spring的讨论。   顺便帮楼主顶一下关于spring的讨论
      

  13.   

    spring acegi URL 感觉配置太麻烦--不如自己写方法:--链接导向表T_URL_FORWARD
    CREATE TABLE IF NOT EXISTS  T_URL_FORWARD(
    UF_ID INTEGER NOT NULL AUTO_INCREMENT COMMENT 'ID', 
    ROLE_ID int(4) NOT NULL COMMENT '角色ID',
    PRG_SUB_NAME varchar(20) NOT NULL COMMENT '子项目名',
    TASK_DEF_ID bigint(20) COMMENT '任务定义ID', 
    KEY_NAME varchar(50) NULL COMMENT '导向关键字',
    URL varchar(100) NOT NULL COMMENT '链接导向',
    PRIMARY KEY (UF_ID),
    UNIQUE KEY (ROLE_ID,TASK_DEF_ID)
    )然后你参考那个过滤器使用反射方式,不同用户不同链接。到时候你用内存数据库什么的,比用
    acegi 快的不是一点半点。spring实在太臃肿。
      

  14.   

    进行URL拦截哪有这么复杂啊。安装一个在web.xml里面安装一个filter就搞定了。没有这么多烦恼。参考:http://www.blogjava.net/Metadmin/archive/2009/06/16/282612.html  《玩转细粒度权限管理》 二,登录及URL拦截
      

  15.   

    再问一下,URL的权限控制,如何处理需要role组合的情况
    比如
    /a.jsp=ROLE_A,ROLE_B
    这样是ROLE_A或ROLE_B都可以访问,我如何使得同时具有ROLE_A和ROLE_B才能访问