我正在使用Spring Security 3.0.4。我有一堆受Spring Security保护的Web服务。当我以未经身份验证的用户身份访问它们时,Spring Security会重定向到登录页面。而不是那样,我想返回HTTP 403错误。我怎样才能做到这一点?
这是我的安全配置:
<http auto-config="false" use-expressions="true" >
<intercept-url pattern="/authorization.jsp" access="permitAll"/>
<intercept-url pattern="/registration.jsp" access="permitAll"/>
<intercept-url pattern="/api/authorization/auth" access="permitAll"/>
<intercept-url pattern="/api/authorization/new" access="permitAll"/>
<intercept-url pattern="/api/accounts/new" access="permitAll"/>
<intercept-url pattern="/app/**" access="permitAll"/>
<intercept-url pattern="/extjs/**" access="permitAll"/>
<intercept-url pattern="/**" access="hasRole('ROLE_USER')" />
<form-login login-page="/authorization.jsp"
default-target-url="/index.jsp"
authentication-failure-url="/registration.jsp?login_error=1"
always-use-default-target="true"
/>
<logout logout-success-url="/authorization.jsp"
logout-url="/j_spring_security_logout"
invalidate-session="true"/>
</http>
答案 0 :(得分:15)
对于java配置,您需要执行
http.exceptionHandling().authenticationEntryPoint(alwaysSendUnauthorized401AuthenticationEntryPoint);
凡alwaysSendUnauthorized401AuthenticationEntryPoint是班级的天堂
public class AlwaysSendUnauthorized401AuthenticationEntryPoint implements AuthenticationEntryPoint {
@Override
public final void commence(HttpServletRequest request, HttpServletResponse response,
AuthenticationException authException) throws IOException {
LOGGER.debug("Pre-authenticated entry point called. Rejecting access");
response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
}
}
这会禁用Spring的默认行为(将未经身份验证的请求重定向到登录表单)。
旁注: 对于这种情况,HTTP代码 SC_UNAUTHORIZED(401)是比 SC_FORBIDDEN(403)更好的选择。
答案 1 :(得分:10)
春季论坛上有一篇文章here,其中概述了如何让您的应用确定两种方法。到目前为止,我使用以下代码来保护我的数据控制器:
<bean id="ep403" class="org.springframework.security.web.authentication.Http403ForbiddenEntryPoint"/>
<sec:http pattern="/data/**" entry-point-ref="ep403" use-expressions="true">
<sec:intercept-url pattern="/**" access="isAuthenticated()"/>
</sec:http>
<bean id="epauth" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
<constructor-arg value="/login.html"/>
</bean>
<sec:http pattern="/**" entry-point-ref="epauth" use-expressions="true">
<sec:intercept-url pattern="/**" access="isAuthenticated()"/>
</sec:http>
因此,我链接的文章中的整个DelegatingAuthenticationEntryPoint解决方案有点重量级,但我认为它的工作也很好。
答案 2 :(得分:9)
你需要
RequestMatcher
以确定哪些请求应获得403(AntPathRequestMatcher
可能就足够了)。HttpSessionRequestCache
以检查匹配器,而不是存储这些页面以进行登录后重定向。DelegatingAuthenticationEntryPoint
直接请求403或重定向登录。请参阅此处的示例:
http://distigme.wordpress.com/2012/11/01/ajax-and-spring-security-form-based-login/
答案 3 :(得分:-4)
除非您将其配置为使用此标记转到另一个网址,否则应返回403错误:
<sec:access-denied-handler error-page="/urlToGoIfForbidden" />