0

新手 Spring MVC/安全问题。我已经设法实现 Spring Security 来管理用户安全/身份验证。我现在想为经过身份验证的用户实现业务逻辑,并根据业务逻辑的结果重定向到不同的视图/页面。

例如(假设用户已成功通过身份验证并具有请求的视图/页面所需的角色):

  • 如果用户尚未验证他们的电子邮件 > 显示电子邮件验证错误视图/页面,其中包含重新发送电子邮件验证电子邮件的链接
  • ELSE IF 用户失败了一些其他业务逻辑 > 显示页面 X
  • ELSE IF 用户失败了一些其他业务逻辑 > 显示页面 Y
  • ELSE > 显示默认的身份验证后视图/页面或请求的视图/页面

我四处搜索并找到了实现此功能的可能方法(例如自定义 authenticationSuccessHandler 和过滤),但在我发现的示例中我不确定:

a) 如何根据业务逻辑的结果重定向到不同的视图/页面

b) 该方法是否会处理尝试直接访问页面的用户(即,通过身份验证但未验证其电子邮件的用户应该被重定向到“电子邮件验证错误”视图/页面,无论他们尝试访问什么 - 即使当他们尝试直接访问(安全)视图/页面)

上述方法的替代方法是在每个控制器中包含业务逻辑,但这感觉不对,并且确信必须有一种更优雅的方式来处理此要求

无论如何,我很想了解“最佳/标准”方法(如果存在这样的事情!)

4

1 回答 1

0

我会将其视为横切关注点,因此我认为您考虑过滤方法是正确的。我不认为实现自定义 AuthenticationSuccessHandler是正确的方法。通过使用过滤器,您将获得对逻辑应用的 URL 的控制,而不仅仅是在用户进行身份验证时。

至于如何实现过滤,有几种配置方法,但我看不出您需要做任何比提供经过良好测试的 javax.servlet.Filter 实现更复杂的事情。

选项 1 是将您的 Servlet 过滤器配置为 Spring Security 过滤器链的一部分。Spring Security 实现为一系列过滤器,每个过滤器都有明确定义的角色。Spring Security 允许您将自定义过滤器插入此链中,以实现特定于应用程序的安全相关逻辑。Spring Security 文档在这里讨论了这一点。

您已经说过,在触及您的业务逻辑之前,您希望用户已经过身份验证并且他们的角色已经过检查,因此您可以将过滤器插入 Spring Security 过滤器链的后部,依靠 Spring Security Filter 实现来强制执行身份验证和角色检查。

另一种方法是直接在 web.xml 中配置 Filter 实现,确保仅在受 Spring Security 保护的 URL 上调用它。在这里,在 web.xml 中声明过滤器的顺序将变得很重要,因为您需要确保在调用自定义过滤器之前首先调用 Spring Security 过滤器链(以确保用户经过身份验证并具有正确的角色)。

于 2013-06-25T16:49:28.453 回答