为什么我的Spring Security Voter只在登录时调用,而不是每次访问页面?

时间:2011-08-17 14:02:26

标签: java spring spring-security

我已经成功创建了一个自定义AccessDecisionVoter类,并通过XML将其绑定到我的Web应用程序中。

现在我想要在每次加载页面时调用它,以确保允许用户访问该特定页面,而不仅仅是整个网站。看起来我的选民只是在我登录时才被调用。

如何在每个页面调用它?

<security:http auto-config="true" 
               use-expressions="true" 
               access-decision-manager-ref="accessDecisionManager">
    <security:intercept-url pattern="/login" access="permitAll" />
    <security:intercept-url pattern="/statics/*" access="permitAll" />

    <security:form-login login-page="/login"
                         authentication-failure-url="/login?error=true"
                         default-target-url="/index" />

    <security:logout invalidate-session="true"
                     logout-success-url="/loggedout"
                     logout-url="/logout" />
</security:http>
<bean id="accessDecisionManager"
      class="org.springframework.security.access.vote.UnanimousBased">
    <property name="decisionVoters">
        <list>
            <bean class="com.tarigma.gem.security.DBVoter" />
        </list>
    </property>
</bean>

2 个答案:

答案 0 :(得分:0)

除非安全链中的先前过滤器被授予访问权限,否则将调用每个请求。

您是否按照请求验证配置了Spring。首先将此过滤器放在链中。记住我的大部分时间都会覆盖这一点。查看配置要检查的资源。 您必须配置执行安全性的uris。

<security:intercept-url pattern="/**" access="permitAll" />

您使用的是注释吗?

<global-method-security secured-annotations="enabled" access-decision-manager-ref="accessDecisionManager"/>

答案 1 :(得分:0)

您有两种选择,这在很大程度上取决于您想要的行为。

  1. 如果您希望每次用户访问任何页面时都执行检查,您需要create a custom filter并在每次请求时与您的选民核对。据推测,只有在用户已经登录等情况下才需要一些逻辑来执行此操作,并且需要采取适当的操作(重定向用户等)。你必须小心这里的无限循环,和/或让过滤器仅应用于某些路径(例如,你不会 - 显然 - 以这种方式保护登录表单。)
  2. 您可以使用Spring Security tag library - 如果您使用JSP作为视图 - 使用标记库中的authorize标记保护您关注的每个页面,并检查角色(或者您定义的任何字符串)您的选民可以投票。
  3. 其中任何一个都可以正常工作,我认为你不会在基线Spring Security中发现任何总是会对每个请求对用户进行身份验证的内容 - 这是框架中的一个操作假设,一旦用户通过身份验证并且他们的确定授权(在登录时),它可能不会改变。

    希望有所帮助!