Javascript 使用spring安全性告诉ajax请求登录页面的位置

Javascript 使用spring安全性告诉ajax请求登录页面的位置,javascript,ajax,spring-security,Javascript,Ajax,Spring Security,我有一些用spring保护的url(通过xml配置)。它起作用了。然而,当我尝试使用ajax请求访问该端点时,我得到了302(find)响应。这会将我的ajax调用重定向到登录页面(因此我得到了html)。但是,我希望得到401(未经授权)响应,该响应带有可供客户端应用程序使用的登录页面的url,因此我可以使用javascript重定向那里的用户。似乎是最接近我想要的,但没有例子,它建议再次更改控制器。spring security中是否没有提供401和url(或其他一些合理的错误消息和登录页面

我有一些用spring保护的url(通过xml配置)。它起作用了。然而,当我尝试使用ajax请求访问该端点时,我得到了302(find)响应。这会将我的ajax调用重定向到登录页面(因此我得到了html)。但是,我希望得到401(未经授权)响应,该响应带有可供客户端应用程序使用的登录页面的url,因此我可以使用javascript重定向那里的用户。似乎是最接近我想要的,但没有例子,它建议再次更改控制器。spring security中是否没有提供401和url(或其他一些合理的错误消息和登录页面的url)的配置?

当然有很多方法可以做到这一点。但您的问题的简短解决方案是以下配置片段:

<bean id="customAuthEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
   <property name="loginFormUrl" value="/your-custom-login" />
</bean>

我还进一步关闭了安全自动配置,以便可以像这样映射上述入口点:

 <security:http auto-config="false" entry-point-ref="customAuthEntryPoint">
   ...
   ...
 </security:http>

...
...

我还重写了一系列spring安全类,以使安全模型完全符合我的要求。这是一个很滑的斜坡,但一旦控件按您希望的方式工作,拥有它就很好了。

您可以扩展LoginUrauThenticationEntryPoint。这是我的一个:

package hu.progos.springutils;
// imports omitted
public class AjaxAwareLoginUrlAuthenticationEntryPoint extends LoginUrlAuthenticationEntryPoint {
    public void commence(final HttpServletRequest request, final HttpServletResponse response, final AuthenticationException authException) throws IOException, ServletException {
        if ("XMLHttpRequest".equals(request.getHeader("X-Requested-With"))) {
            response.sendError(HttpServletResponse.SC_FORBIDDEN, "Access Denied");
        } else {
            super.commence(request, response, authException);
        }
    }
}
然后配置spring以使用您的实现:

<beans:bean id="authEntryPoint" class="hu.progos.springutils.AjaxAwareLoginUrlAuthenticationEntryPoint" scope="singleton>
    <beans:property name="loginFormUrl" value="/login.html" />
</beans:bean>

<http entry-point-ref="authEntryPoint">
  <!-- your settings here -->
</http>

相同吗在Spring3中?我现在正在使用它。如果您没有登录,您希望应用程序中的所有URL都返回401,还是只希望一些URL(仅限于AJAX)返回401?谢谢。这似乎是正确的解决方案。我们不再使用ajax了,所以我不再需要它了。这是一个比使用过滤器检查每个请求更优雅的解决方案。Thx。非常好的解决方案,谢谢!我做了一个小改动,因为我收到一条警告,说设置
loginFormUrl
属性已被弃用。我在
ajaxawareloginulauthenticationentrypoint
class
super(loginFormUrl)中添加了一个构造函数
并将bean def更改为使用
构造函数arg value=“/login.html”/>
我在这里用代码发布了一个答案: