Spring框架如何检查用户帐户是不是过期?
Posted
技术标签:
【中文标题】Spring框架如何检查用户帐户是不是过期?【英文标题】:How Spring framework checks if the user account is expired?Spring框架如何检查用户帐户是否过期? 【发布时间】:2017-10-29 12:03:41 【问题描述】:我可以看到这个 html 页面: https://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/authentication/AccountExpiredException.html
在我的代码中,我使用以下内容:
try
providerManager.authenticate(auth);
catch(LockedException e)
// some user exception to throw
catch(DisabledException e)
// some user exception to throw
catch(AccountExpiredException e)
// some user exception to throw
那么 Spring 是如何判断用户账号是否过期的呢?
我必须进行测试,因此我必须使用户帐户过期。这就是为什么。
【问题讨论】:
通过在User
上调用isNotExpired
方法。但是,您为什么还要对此进行测试并抛出单独的异常?感觉就像您正在处理 Spring Security 的异常处理,并向用户公开重要信息(即帐户锁定、过期等),这对于黑客来说又是有价值的信息。
isNotExpired
是 getter 方法。但是将过期变量设置为 TRUE 的 setter 方法在什么条件下将其设置为 TRUE 呢?我只想给用户一个帐户过期的具体原因。除了可能导致黑客入侵的信息之外,没有其他信息。
公开该信息是黑客的信息,他有一个现有的帐户。几天后他可能会再试一次……您可能希望在内部记录该信息,但不要将其公开给最终用户。如何设置,取决于你使用什么,默认是true
,并且只设置了enabled
。
【参考方案1】:
基本上,spring 以http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/core/userdetails/UserDetails.html 的身份与用户一起工作。因此,您需要找到将用户实体转换为 UserDetails 的代码。也许您正在使用一些默认机制,例如内存或 JDBC(检查您的 http://docs.spring.io/spring-security/site/docs/current/apidocs/org/springframework/security/config/annotation/web/configuration/WebSecurityConfigurerAdapter.html),在这种情况下,您需要检查此机制的文档/源代码。
【讨论】:
是的,我们有 UserDetails 类。当我们登录用户时,我们将 UserDetails 构造函数设置为 accountNonExpired = TRUE。所以在我们的例子中,它是真实的。是预期的吗? 如果您的系统不支持锁定、禁用或过期的帐户,这是正常的。可能用户实体没有对应的字段以及数据库表。所以所有用户都没有被锁定/禁用/过期。如果要添加它,则需要将相应的属性添加到表中,为用户实体创建字段,使用您的 ORM 读取它,然后将值传递给 UserDetails。 我会说,好吧,Spring 使用了 UserDetails,在我的代码中它被设置为 TRUE。以上是关于Spring框架如何检查用户帐户是不是过期?的主要内容,如果未能解决你的问题,请参考以下文章
如何包括是不是为 Spring Boot 用户身份验证启用用户帐户