我有一个“鸡蛋”问题。 在应用程序中,我使用UserDetailsService来获取用户(我们不会在用户信息中存储用户信息,我们使用第三方服务来实际获取所有信息)。
最近我们添加了帐户激活功能。注册后,我们会向用户发送激活电子邮件,如果他点击它,我们会将用户标记为ACTIVE并将其重定向到登录页面。用户只有在具有ACTIVE状态时才能登录。问题是:我们将从激活帐户的日期开始向用户收费,即使他从未登录过。我怎样才能(可能使用Spring security)几乎同时进行这些流程(激活和登录)?我们不想向用户收费,如果他只是激活他的帐户,我们只想在他登录后(激活后)向他收费。所以我真的可以这样做“用户点击激活链接,登录然后他的状态变为ACTIVE(但他只能在他是ACTIVE时登录)”。
很抱歉,如果我的问题描述不够明确
我会感激任何反馈。
谢谢!
答案 0 :(得分:0)
如果我理解您的要求,您需要两个不同的入口点(登录页面)到您的应用程序:
问题是认证逻辑需要是上下文敏感的,并且要知道上述哪些页面启动了认证。但是,该框架并非针对此类不常见的用例而设计,因此身份验证提供程序不了解实际发送登录表单的URL。
您需要解决的是以某种方式将上下文信息传递给身份验证提供程序,该身份验证提供程序根据该信息处理auth请求(即,验证仅从
WebAuthenticationDetailsSource
和WebAuthenticationDetails
的自定义版本(最好通过子类化后者),以存储和公开身份验证请求的URI。 (这将是auth提供程序可以实现其条件逻辑的上下文信息。)UsernamePasswordAuthenticationFilter
的两个不同实例。将他们的filterProcessesUrl
属性分别设置为/j_spring_security_check_active_user
和/j_spring_security_check_nonactive_user
,并在两者中注入上面创建的自定义AuthenticationDetailsSource
。DaoAuthenticationProvider.additionalAuthenticationChecks()
:
WebAuthenticationDetails
对象中的URI(可通过authentication.getDetails()
访问)AccountStatusException
。/j_spring_security_check_nonactive_user
与/j_spring_security_check_active_user
)。