无状态身份验证是否适合每个用户的数据库连接?

时间:2019-01-11 14:13:41

标签: java hibernate spring-boot stateless stateful

问题

我正在开发一个应用程序,与许多应用程序一样,它从登录页面开始,然后显示任何类型的数据。

问题是我的客户明确要求输入的凭据应用于访问数据库。

这意味着,与其在“用户”表上运行用户名/密码,不如将它们用于获取用户的数据库个人访问权限。

由我的上级决定,该应用程序将基于SpringBoot框架构建,而恰好是使用无状态JWT身份验证机制。

在比较无状态与有状态的好处时,我不是专家,但是如果我正确理解了这个概念,这意味着我的应用程序将需要针对每个单个请求重新建立数据库连接,对吗? / p>

我之所以这样问,是因为我们的响应时间很慢。 该代码似乎在与数据库设置相关的代码上挂了一段时间,例如

dataSrc.getConnection();

entityManagerFactoryBean.afterPropertiesSet();

可能的解决方案?

我听说过Hibernate的StatelessSession,但是设置失败。

我什至不确定它是否会帮上什么忙,但据我所读,它使用了较低级别的Hibernate API,这可能有助于缓解该问题,而不会对已经编码的方式产生太大影响。 SQL操作是专门用于存储过程的调用,其中手动映射到Java对象。

我需要什么帮助

基本上,我只想回答3个问题:

问题1: 因为无状态模型不适合我的用例场景,我是否应该简单地恢复为有状态认证?

问题2和3: StatelessSession系统甚至可以在我的方案中实现,并且对数据库连接时间有重大影响吗?

但是,当然,如果您知道有任何其他线索可以帮助我解决问题而不必将整个事情都恢复为有状态,那么我就接受了!

1 个答案:

答案 0 :(得分:1)

最终有时间回答这个问题(以防将来有人路过)。

基本上,我有两个选择:完全删除Hibernate或“返回”有状态会话。

我选择了第一个选项,但只能这样做是因为我们在java对象和数据库之间没有基于注释的映射。 进入有状态可能是更好的方法,但是我真的不知道该怎么做。我发现大量文章强调了如何进入无状态状态,但没有强调如何返回无状态状态……嗯……向后做这还不够,因为我会丢失很多配置,所以我d必须进行研究,这是我无暇处理的麻烦。

使用 org.springframework.web.filter.GenericFilterBean 的自定义实现,我将每个传入请求都包装在包含数据库连接的自定义requestWrapper中。 我使用Java(低级)API打开/创建上述连接: java.sql.DriverManager.getConnection

然后我可以从我的包装器中恢复此连接,Spring使用此代码通过应用程序来控制该连接:

SELECT RT.EMP_ID, RT.EMP_NAME, RT.EMP_EMAIL_ID, RPM.WEEK_ENDING, RPM.RSC_HOURS_LOGGED FROM vl.rsrc_prjct_hrs_mapping RPM right outer Join vl.resource RT ON RT.EMP_ID = RPM.EMP_ID and RPM.WEEK_ENDING BETWEEN '2018-07-07' AND '2018-08-07' ... OUTER JOIN vl.project PT ON PT.PROJECT_ID=RPM.PROJECT_ID and PT.PROJECT_DESC='33801-Urgent Care EnhancementEPDS V2' AND PT.PROJECT_IRM='TMPT-4854'

请不要忘记正确关闭所有内容,以免导致内存泄漏,您已设置好。 只需在应用程序主类中调用该Driver的构造函数,就需要正确注册该Driver。