Spring Security 打开一个弹出式登录

Posted

技术标签:

【中文标题】Spring Security 打开一个弹出式登录【英文标题】:Spring security opening a popup login 【发布时间】:2014-10-25 18:14:53 【问题描述】:

当用户做了一些需要验证的事情而他不是时,有人知道如何打开一个弹出登录来验证(使用spring security)。

例如:假设页面有一个“立即购买”按钮,该按钮将产品添加到购物车并执行结帐(立即购买页面),如果用户已经通过身份验证,或者打开一个弹出窗口供用户执行身份验证。

如果验证成功,则 spring 重定向到“立即购买”页面或停留在该页面并打开弹出窗口(带有错误消息“登录错误”)。

我已经在谷歌搜索了一种解决方案,但没有运气。

谁能指出我正确的方向?

谢谢

【问题讨论】:

据我了解,问题不在于打开弹出窗口,更多的是知道何时打开弹出窗口,而无需重新加载当前页面,以防访问被拒绝。 ——对吗? 你可以试试这个answer。 【参考方案1】:

只是一个想法,还没来得及测试。它只是客户端。

    在链接/按钮单击事件上放置一个事件监听器 使用 javascript 并通过XMLHttpRequest 调用表单操作或链接 检查HTTP状态码:xhr.status if (OK) 将当前 url 替换为目标 url (via html5 History API) 并将整个文档替换为 xhr.responseText (What other options for replacing entire HTML document via W3C DOM) else if (Redirect) just follow the redirect else if (Unauthorized) open popup

【讨论】:

【参考方案2】:

将任务分解为组件。

创建一个根据您的标准激活的灯箱。

使您的表单可通过 ajax 提交。

您的身份验证控制器需要执行以下操作:

如果成功 -> 重定向到结帐页面 如果不成功,则返回一个片段,告知其不正确的原因。

如果返回不正确,您需要完全刷新表单元素以确保没有 csrf 攻击。

这就是我完成的方式,不能给你代码,因为它取决于你如何设置你的项目和查看渲染。

【讨论】:

OP的问题更多是关于如何启动身份验证,以便在正确的时刻显示身份验证框,而不是如何提交用户名和密码。【参考方案3】:

您也许可以使用http基本身份验证,至少在您需要身份验证时它会始终打开一个弹出窗口。 http://www.baeldung.com/spring-security-basic-authentication

【讨论】:

【参考方案4】:

当用户点击Buynow按钮时,您可以使用ajax调用来检查用户是否通过身份验证。

如果用户通过身份验证,则提交或转发产品购物车表单到下一个视图(控制器方法)。

如果未通过身份验证,您可以打开一个弹出窗口进行登录。

在登录表单中使用 ajax 验证用户,如果成功将购物车表单提交到下一个视图,否则会给出错误消息。

将购物车信息存储在会话中,以便您可以在下一个视图中使用它们。

【讨论】:

【参考方案5】:

某些事件的弹出框实现必须由您完成(您可以为此使用任何前端框架)。尽管需要考虑身份验证,但“project-security.xml”将为您完成。您应该只根据您的要求配置它。

【讨论】:

【参考方案6】:

实际上 Spring Security 支持开箱即用的重定向,看看 SavedRequestAwareAuthenticationSuccessHandler,所以你唯一需要做的就是保护 url(例如你有类似 <intercept-url pattern = "/purchase/*" access = "isAuthenticated()" /> 的东西(或者如果 @987654323 @无论你在那里做什么)你的购买按钮(确实请求"/purchase/"productIdHere"/purchase?productId=someProductId),然后将用户重定向到登录页面,成功登录后他应该回到原来的页面。 在您的控制器中,您可以处理如下请求:

@Controller
...

@RequestMapping(value = "/purchase..., method = ....)
public ModelAndView purchase(@PathVariable("productId") String/Long productId (or @RequestParam etc...)
Product someProduct = someService.getByProductId(productId);
ModelAndView mav = new ModelAndView("view.name");
mav.setObject("product",product);
return mav;

您必须根据自己的需要匹配其他内容,只需按照您的要求指出正确的方向。

希望对你有帮助。

【讨论】:

但是重定向不是弹出窗口。 他们特别要求停止重定向并改用模态窗口。【参考方案7】:

您可以使用带有 Ajax 身份验证的 CSS HTML 登录表单(只需在 Web 上搜索)或使用 Spring Http Basic Auth 弹出窗口。每个页面都应检查用户是否经过身份验证(显示弹出窗口)。

查看这两篇文章,了解如何实施这两种解决方案:

Adding Http Basic Auth to RESTful Services in Java and Spring

Spring security Ajax login

【讨论】:

【参考方案8】:

Spring 安全性在 Spring MVC 上运行 - 它使用重定向。所以这个想法是当用户试图访问“安全”内容时,他还没有通过身份验证,然后返回 HTTP 302 并重定向到登录页面。如果你对弹窗感兴趣,你就打破了MVC模式,当然可以实现,但是你的日子会难上加难......

【讨论】:

以上是关于Spring Security 打开一个弹出式登录的主要内容,如果未能解决你的问题,请参考以下文章

使用spring webMVC和spring security的ajax登录

使用 spring security ldap 禁用基本身份验证

Spring Security 多个登录用户失败

使用 spring security 确定 JSP 中的安全 url

未调用 Spring Security 自定义登录表单

Spring Security Ajax 登录在以下请求中成功验证 null