我将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>
任何人都可以帮助我吗? 也许你有任何想法如何解决它?
答案 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设置的典型执行流程:
AccessDeniedException
被抛出并被ExceptionTranslationFilter
捕获。该过滤器会在会话中添加来自匿名用户的请求。ParameterizedLoginUrlAuthenticationEntryPoint
bean)然后将用户重定向到登录页面。此重定向以HTTP 302
重定向完成。SavedRequestAwareAuthenticationSuccessHandler
。该处理程序加载保存的请求(存储在步骤2中的会话中)&amp;将用户重定向到该页面(再次使用HTTP 302
重定向。)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,我会得到 登录页面,然后我转发到“家”,而我想 访问我的特定屏幕。
这根本不是春天决定的。您的网址必须不同,或者您的会话已过期。