弹簧。 Java的。登录并激活电子邮件

时间:2013-04-16 18:52:35

标签: login spring-security activation

我有一个“鸡蛋”问题。 在应用程序中,我使用UserDetailsS​​ervice来获取用户(我们不会在用户信息中存储用户信息,我们使用第三方服务来实际获取所有信息)。

最近我们添加了帐户激活功能。注册后,我们会向用户发送激活电子邮件,如果他点击它,我们会将用户标记为ACTIVE并将其重定向到登录页面。用户只有在具有ACTIVE状态时才能登录。问题是:我们将从激活帐户的日期开始向用户收费,即使他从未登录过。我怎样才能(可能使用Spring security)几乎同时进行这些流程(激活和登录)?我们不想向用户收费,如果他只是激活他的帐户,我们只想在他登录后(激活后)向他收费。所以我真的可以这样做“用户点击激活链接,登录然后他的状态变为ACTIVE(但他只能在他是ACTIVE时登录)”。

很抱歉,如果我的问题描述不够明确

我会感激任何反馈。

谢谢!

1 个答案:

答案 0 :(得分:0)

如果我理解您的要求,您需要两个不同的入口点(登录页面)到您的应用程序:

  1. 一个用于尚未激活的用户的激活(首次登录)。
  2. 活跃用户的另一个“普通”用户。
  3. 问题是认证逻辑需要是上下文敏感的,并且要知道上述哪些页面启动了认证。但是,该框架并非针对此类不常见的用例而设计,因此身份验证提供程序不了解实际发送登录表单的URL。

    您需要解决的是以某种方式将上下文信息传递给身份验证提供程序,该身份验证提供程序根据该信息处理auth请求(即,验证仅从非活动用户,并进行身份验证< em>仅从url2登录的活动用户)。可能有数百种不同的方法来实现这一点,一种可能的解决方案是放置两个不同的身份验证过滤器,拦截发送到两个不同URL的身份验证请求。详情如下:

    1. 创建自己的现有WebAuthenticationDetailsSourceWebAuthenticationDetails的自定义版本(最好通过子类化后者),以存储和公开身份验证请求的URI。 (这将是auth提供程序可以实现其条件逻辑的上下文信息。)
    2. 在过滤器链中配置并插入UsernamePasswordAuthenticationFilter的两个不同实例。将他们的filterProcessesUrl属性分别设置为/j_spring_security_check_active_user/j_spring_security_check_nonactive_user,并在两者中注入上面创建的自定义AuthenticationDetailsSource
    3. 以下列方式覆盖子类中的DaoAuthenticationProvider.additionalAuthenticationChecks()
      • 检索存储在上面创建的WebAuthenticationDetails对象中的URI(可通过authentication.getDetails()访问)
      • 根据URI断言用户处于活动/非活动状态,如果asserion失败则抛出AccountStatusException
      • 如果断言成功,请不要忘记委托给超类。
    4. 创建帖子开头提到的两个不同的登录页面,确保登录表单将凭据发布到各自的URL(/j_spring_security_check_nonactive_user/j_spring_security_check_active_user)。