使用excel超链接弹簧安全重定向

时间:2013-06-11 08:57:27

标签: spring spring-security

我将Spring Security用于我的Web应用程序 默认情况下,身份验证机制会将用户重定向到“主目录”,但可以通过其URL直接访问应用程序的一个屏幕。

如果您在网络浏览器中填写网址,那么一切运作良好。

但是,如果我在Excel工作表中有一个超链接,使用相同的URL,我会获得登录页面,然后我转到“主页”,而我想访问我的特定屏幕。

如果我用OpenOffice打开Excel工作表,一切都运行良好;好像我在网页浏览器中填写了网址。

这是我的配置:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:context="http://www.springframework.org/schema/context"
xmlns:security="http://www.springframework.org/schema/security"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd  
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
     http://www.springframework.org/schema/security http://www.springframework.org/schema/security/spring-security-3.1.xsd"> 

<security:http auto-config="true" access-denied-page="/accessDenied.jsp" use-expressions="true" access-decision-manager-ref="accessDecisionManager" entry-point-ref="entryPoint">
<security:intercept-url pattern="/css/*.css" access="permitAll" />
<security:intercept-url pattern="/images/**" access="permitAll" />
<security:intercept-url pattern="/javascript/*.js" access="permitAll" />
<security:intercept-url pattern="/j_spring_security_check" access="permitAll"/>
<security:intercept-url pattern="/register.*" access="permitAll" />
<security:intercept-url pattern="/registerUser.*" access="permitAll" />
<security:intercept-url pattern="/login.*" access="permitAll" />
<security:intercept-url pattern="/restore/*" access="permitAll" />
<security:intercept-url pattern="/customer/**" access="permitAll" />
<security:intercept-url pattern="/logout.*" access="isAuthenticated()" />
<security:intercept-url pattern="/j_spring_security_logout"  access="isAuthenticated()"/>
<security:intercept-url pattern="/index.*"  access="isAuthenticated()" />
<security:intercept-url pattern="/admin/**" access="hasRole('ADMIN')" />
<security:intercept-url pattern="/template/*" access="isAuthenticated()" />
<security:intercept-url pattern="/editor/*" access="hasRole('EDITOR')" />
<security:intercept-url pattern="/creator/*" access="hasRole('CREATOR')" />
<security:intercept-url pattern="/task/*" access="hasAnyRole('CREATOR','EDITOR')"/>
<security:intercept-url pattern="/ajax/*" access="hasAnyRole('CREATOR','EDITOR')"/>
<security:intercept-url pattern="/**" access="isAuthenticated()" />
<security:form-login default-target-url="/index.jsp" authentication-failure-url="/login.jsp?login_error=true"/>
<security:logout  invalidate-session="true" logout-url="/logout.jsp" logout-success-url="/login.jsp"/>
</security:http>

<security:authentication-manager alias="authenticationManager">
    <security:authentication-provider ref="userEnvironmenttStatisticService" />
</security:authentication-manager>

<security:global-method-security secured-annotations="enabled" pre-post-annotations="enabled">
    <security:expression-handler ref="expressionHandler" />
</security:global-method-security>

<bean id="userEnvironmenttStatisticService" class="com.epam.crs.security.UserEnvironmenttStatisticService">
    <property name="userDetailsService" ref="userDetailsService" />
</bean>

<bean id="accessDecisionManager" class="org.springframework.security.access.vote.AffirmativeBased">
    <constructor-arg>
        <list>
            <ref bean="notDeletedVoter" />
        </list>
    </constructor-arg>
</bean>

<bean id="notDeletedVoter" class="com.epam.crs.security.NotDeletedVoter" />

<bean id="entryPoint" class="com.epam.crs.security.ParameterizedLoginUrlAuthenticationEntryPoint">
    <constructor-arg value="/login.jsp"/>
</bean>

<bean id="customPermissionEvaluator" class="com.epam.crs.security.CustomPermissionEvaluator" />

<bean id="expressionHandler"
    class="org.springframework.security.access.expression.method.DefaultMethodSecurityExpressionHandler">
    <property name="permissionEvaluator" ref="customPermissionEvaluator" />
</bean>
</beans>

任何人都可以帮助我吗? 也许你有任何想法如何解决它?

3 个答案:

答案 0 :(得分:3)

我在类似的系统上遇到了同样的问题。以下是我修复它的方法以及我调查后的更多细节。

我如何修复我的类似应用

我更新了入口点,因此它使用转发。您的更新代码将是:

<bean id="entryPoint" class="com.epam.crs.security.ParameterizedLoginUrlAuthenticationEntryPoint">
    <constructor-arg value="/login.jsp"/>
    <property name="useForward" value="true" />
</bean>

注意:这要求您的入口点来自LoginUrlAuthenticationEntryPoint

更多细节..

典型的执行流程:

这是像您这样的Spring Security设置的典型执行流程:

  1. 匿名用户点击安全页面。
  2. AccessDeniedException被抛出并被ExceptionTranslationFilter捕获。该过滤器会在会话中添加来自匿名用户的请求。
  3. 安全入口点(即您的ParameterizedLoginUrlAuthenticationEntryPoint bean)然后将用户重定向到登录页面。此重定向以HTTP 302重定向完成。
  4. 用户输入有效凭据。
  5. 调用默认SavedRequestAwareAuthenticationSuccessHandler。该处理程序加载保存的请求(存储在步骤2中的会话中)&amp;将用户重定向到该页面(再次使用HTTP 302重定向。)
  6. Excel如何与

    混淆

    Excel for reasons that are out of scope在将网址传递到默认浏览器之前使用简单的http客户端。

    该http客户端将传递返回HTTP 200代码的第一个网址。

    http客户端将触发流程中的3个第一步,登陆登录页面。

    由于登录页面会发出HTTP 200,这是Excel的http客户端将发送到您的浏览器的网址。

    浏览器打开登录页面,但它会收到一个新的会话ID:它不共享Excel的http客户端的会话cookie。

    当用户输入有效凭据时,调用SuccessHandler,就像在步骤5中一样,除了用户会话中没有保存的请求(保存的请求保存在Excel的http客户端会话中,而不是用户的一个)。处理程序默认将用户发送到默认页面:您的home页面。

    为什么转发会修复此问题?

    Forwarding只是处理服务器端的重定向,不包括进程中的浏览器/客户端。因此,在典型的流程示例中,所有重定向都是在服务器端完成的。

    具体而言,这意味着URL不会改变。这允许Excel的http客户端将正确的URL传递给浏览器,允许您的用户完成5步骤过程而无需任何操作。

答案 1 :(得分:1)

我遇到了同样的问题,对我来说这有助于我: http://support.microsoft.com/kb/218153

安装Microsoft Fix it 50655: http://go.microsoft.com/?linkid=9769998

答案 2 :(得分:0)

  

如果您在网页浏览器中填写网址,那么一切运作良好。

     

但是,如果我在Excel表格中有一个超链接,使用相同的URL,我会得到   登录页面,然后我转发到“家”,而我想   访问我的特定屏幕。

这根本不是春天决定的。您的网址必须不同,或者您的会话已过期。