我在我的应用程序中使用spring-security和jQuery.主页使用Ajax动态加载内容到选项卡.一切都很好,但有时我的选项卡中有登录页面,如果我输入凭据,我将被重定向到没有标签的内容页面.
所以我想处理这种情况.我知道有些人使用ajax身份验证,但我不确定它是否适合我,因为它对我来说看起来很复杂,我的应用程序不允许任何访问而无需登录.我想为所有ajax响应编写一个全局处理程序,window.location.reload()如果我们需要进行身份验证,它将会执行.我认为在这种情况下,最好是获取401错误而不是标准登录表单,因为它更容易处理.
所以,
1)是否可以为所有jQuery ajax请求编写全局错误处理程序?
2)我如何自定义spring-security的行为以便为ajax请求发送401错误,但是常规请求像往常一样显示标准登录页面?
3)你可能有更优雅的解决方案吗?请分享.
谢谢.
我在spring安全配置文件中声明了以下内容(http://www.springframework.org/schema/security/spring-security-2.0.1.xsd):
<form-login login-page="/login.html" />
Run Code Online (Sandbox Code Playgroud)
如果用户没有正确的身份验证凭据,Spring Security会将用户重定向到该页面.如何获取用户试图访问的页面的URL?
我正在尝试这样做:让spring security在登录页面的查询字符串中添加返回url,即:获取spring告诉登录页面我来自哪里.我有一些SSO集成..所以我会发送url给他们,或者他们会为我添加引用,所以我知道用户应该登录并发送给/some/url.这都是花花公子.我遇到的问题是扩展LoginUrlAuthenticationEntryPoint(除非你能告诉我一个很好的理由来实现AuthenticationEntryPoint).我只需要修改登录页面的请求,如下所示:
RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
// only append returnto to '/login' urls
if(request.getServletPath() == "/login") {
// indicates we want to return to this page after login
redirectStrategy.sendRedirect(request, response, "/login?returnto=" + request.getServletPath());
}
Run Code Online (Sandbox Code Playgroud)
我怎样才能让剩下的请求做他们的事情?这是不正确的(我刚刚做的):
RequestDispatcher dispatcher = request.getRequestDispatcher("/login");
// just forward the request
dispatcher.forward(request, response);
Run Code Online (Sandbox Code Playgroud)
因为它把我们放在一个重定向循环中.然而,它似乎是春天的版本commence.我糊涂了.我应该commence在自定义扩展程序中做LoginUrlAuthenticationEntryPoint什么?
问题场景
我目前正在处理我的应用程序的登录页面,该页面基于Spring启动和相关的Spring项目(如安全性和云).我希望我的应用程序的用户为登录页面添加书签,因此需要采取这种行为.当我开始考虑潜在的问题时,我认为在您为页面添加书签后,应用程序将无法知道重定向到哪里(因为这可能是多个URL)(因为只有/ login且没有重定向,所以).通常,用户不会,例如,/ dashboard被重定向到登录,因为没有身份验证.在使用呈现他或她的凭证之后,应用程序重定向用户.但这只是可能的原因,应用程序在当前会话中保存SavedRequest,告知重定向位置.
我想要实现的目标
基本上我想要实现的是应用程序在用户在/ login url上设置书签后知道去哪里.这里理想的情况是/ login url包含重定向参数.例如.
现在,如果用户将对在步骤2中提供的URL添加书签,则在一段时间之后单击书签时,将向应用程序提供足够的信息以进行合理的重定向.
如果有人知道更好的方法,我想听听.
迄今采取的步骤
到目前为止,我的搜索基于StackOverflow上的另一个答案.这似乎是朝着正确方向迈出的一步,但仍然缺少一些所需的功能.
我首先创建了LoginUrlAuthenticationEntryPoint类的Custom实现.它会覆盖begin方法,如下所示:
public class CustomLoginUrlAuthenticaitonEntryPoint extends LoginUrlAuthenticationEntryPoint
{
@Override
public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException, ServletException
{
if (!request.getRequestURI().equals(this.getLoginFormUrl()))
{
RedirectStrategy redirectStrategy = new DefaultRedirectStrategy();
redirectStrategy.sendRedirect(request, response, getLoginFormUrl() + "?redirect=" + request.getRequestURI() + "?" + request.getQueryString());
}
}
}
Run Code Online (Sandbox Code Playgroud)
然后我将此自定义类添加到HttpSecurity作为默认身份验证入口点.
@Configuration
@Order(-20)
public class SecurityConfig extends WebSecurityConfigurerAdapter …Run Code Online (Sandbox Code Playgroud)