如何使用或不使用spring-security在项目中实现以下功能。
1。 LoggedIn Count:用户登录系统的次数。
2。时间花费:用户花费的总时间。
截至目前,我已经考虑过使用javascript的解决方案,其中一个请求将定期发送到服务器。在服务器内部,它将增加消费时间变量。
仍然想知道,是否有任何与弹簧安全本身相关的东西。或任何其他想法来处理这种功能。
任何想法/建议都会受到高度赞赏......
答案 0 :(得分:1)
我曾经使用过那些完全相同的技术(只是不是SpringSecurity)而且我做了类似的事情,我想我可以告诉你如何做到这一点。我认为它会起作用:
<强> 1 强> 要计算成功登录的名称,您需要在实体中使用变量。 当用户成功登录时,该变量需要增加1。我认为增加该值的最佳时机是验证是否正确并且授予访问权限(您可以在验证方法中实现)。 所以你要做的是使用Hibernate查询语言获取该用户的变量的当前值,添加1然后更新该行。
<强> 2 强> 对于这个我不确定在100%,但你可以尝试: User表中名为 loginTime 的变量需要以@ApplicationState。
的形式存在然后在您的注销功能中,您将创建一个tempVariable,它将在当前时间保存时间(一个长变量)。 您将执行减法操作(logOutTime - logInTime),您将获得该会话上以毫秒为单位的时间。 因此,在删除会话并注销真实之前,只需更新数据库中的列,以便将要注销结果的用户。
另外我想提一下,这2个想法可能会使用程序化方法解决问题,但我相信如果您调查Spring Security,您可能会找到在某种日志或类似日志中查找该信息的方法(之前从未使用过Spring Security)
我希望我能正确地解释自己。 祝你好运
答案 1 :(得分:1)
有很多方法可以做到这一点,这取决于你所遵循的架构。
您可以使用以下
protected void successfulAuthentication(HttpServletRequest request, HttpServletResponse response, Authentication authResult) {
SecurityContextHolder.getContext().setAuthentication(authResult);
if (this.eventPublisher != null) {
eventPublisher.publishEvent(new InteractiveAuthenticationSuccessEvent(authResult, this.getClass()));
}
}
或
使用spring security
<bean id="authenticationFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter"
p:sessionAuthenticationStrategy-ref="sas"
p:authenticationManager-ref="authenticationManager"
p:authenticationFailureHandler-ref="customAuthenticationFailureHandler"
p:authenticationSuccessHandler-ref="customAuthenticationSuccessHandler"/>
或使用任何自定义过滤器
人们通常会将更多指针用于用户跟踪/分析
一旦所有这些信息都存储在持久性存储中,它们通常会在其上创建一个报告/过程,以获取所有这些信息,例如一天中有多少用户,或者用户登录过多少次一个月或他在一个月内在网站上花了多长时间等......
答案 2 :(得分:1)
1)对于登录的数量,最好的方法是使用AuthenticationSuccessHandler插入Spring Security,如@user395072
所述,并将结果保存在numOfSuccessfulLogins
的用户表中,每次成功登录时都会加+1
2)对于在网站上花费的时间,您需要的是一个会话变量,让我们称之为$MY_TIME
。如果会话中不存在$MY_TIME
,则每次请求 ,您将其设置为当前日期(即System.currentTimeMillis()
)。如果它确实存在,则比您获取当前时间并减去$MY_TIME
值,并且您在当前会话中有到目前为止所花费的时间。在同一个请求上你需要坚持下去。当您将$MY_TIME
设置为会话并每隔一次更新最新记录时,您可以为其添加新记录的separete表。或者,您可以在用户表中添加2个字段:cumulativeTime
和currentSessionTime
,并在将cumulativeTime += currentSessionTime
设置为会话时添加更新currentSessionTime = 0
和$MY_TIME
其他请求更新currentSessionTime = System.currentTimeMillis() - $MY_TIME
。