无状态身份验证是否适用于每个用户的数据库连接?
Is stateless authentication adapted to a per-user database connection?
问题
我正在开发一个应用程序,与许多应用程序一样,在显示任何类型的数据之前从登录页面开始。
问题是我的客户特别要求输入的凭据应该用于访问数据库。
这意味着,代替 运行 "user" table 的用户名/密码,它们将用于获取用户的数据库个人访问权限。
我的上级决定这个应用程序将构建在 SpringBoot 框架之上,恰好使用无状态 JWT 身份验证机制。
在比较无状态与有状态的优势方面我不是专家,但如果我正确理解了这个概念,这意味着我的应用程序将需要为每个请求重新建立数据库连接,对吧?
我问这个是因为我们的响应时间非常慢。
该代码似乎在数据库设置相关代码上挂了一会儿,例如
dataSrc.getConnection();
或
entityManagerFactoryBean.afterPropertiesSet();
可能的解决方案?
听说过Hibernate的StatelessSession,但是设置不成功
我什至不确定它是否有帮助,但据我所知,它使用了较低级别的 Hibernate API,这可能有助于缓解问题,但不会对过程产生太大影响事情已经编码,因为 SQL 操作完全是存储过程调用,手动映射到 Java 对象。
我需要什么帮助
基本上,我只想要 3 个问题的答案:
问题 1:
我是否应该简单地恢复到有状态身份验证,因为无状态模型不适合我的用例场景?
问题 2 & 3 :
StatelessSession 系统甚至可以在我的场景中实现吗,它会对数据库连接时间产生重大影响吗?
但是,当然,如果你知道任何其他线索可以帮助我解决我的问题,而不必将整个事情恢复到 Stateful,我会接受它!
终于有时间来回答了(以防以后有人路过)
基本上,我有两个选择:完全删除 Hibernate 或 "go back" 到有状态会话。
我选择了第一个选项,我只能这样做,因为我们的 java 对象和数据库之间没有基于注释的映射。
Going Stateful 可能是一种更好的方法,但我真的不知道该怎么做。我发现大量文章都在强调如何去无状态,但没有强调如何回到有状态,而且......好吧......向后做是不够的,因为我会错过很多配置,所以我'我必须研究它,这是一个我没有时间处理的麻烦。
使用 org.springframework.web.filter.GenericFilterBean 的自定义实现,我将每个传入请求包装在包含数据库连接的自定义 requestWrapper 中。
我使用 java(低)API 打开/创建所述连接:java.sql.DriverManager.getConnection
然后我可以从我的包装器中检索此连接,该连接由 Spring 通过应用程序使用此代码进行传输:
ServletRequestAttributes att = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
ContentCachingRequestWrapper springWrapper = (ContentCachingRequestWrapper) att.getRequest();
CustomWrapper myWrapper = (CustomWrapper) springWrapper.getRequest();
myWrapper.getConnection();
只是不要忘记正确关闭所有内容以避免内存泄漏,这样就可以了。
还需要正确注册驱动程序,只需在应用程序主 class.
中调用所述驱动程序的构造函数即可
问题
我正在开发一个应用程序,与许多应用程序一样,在显示任何类型的数据之前从登录页面开始。
问题是我的客户特别要求输入的凭据应该用于访问数据库。
这意味着,代替 运行 "user" table 的用户名/密码,它们将用于获取用户的数据库个人访问权限。
我的上级决定这个应用程序将构建在 SpringBoot 框架之上,恰好使用无状态 JWT 身份验证机制。
在比较无状态与有状态的优势方面我不是专家,但如果我正确理解了这个概念,这意味着我的应用程序将需要为每个请求重新建立数据库连接,对吧?
我问这个是因为我们的响应时间非常慢。 该代码似乎在数据库设置相关代码上挂了一会儿,例如
dataSrc.getConnection();
或
entityManagerFactoryBean.afterPropertiesSet();
可能的解决方案?
听说过Hibernate的StatelessSession,但是设置不成功
我什至不确定它是否有帮助,但据我所知,它使用了较低级别的 Hibernate API,这可能有助于缓解问题,但不会对过程产生太大影响事情已经编码,因为 SQL 操作完全是存储过程调用,手动映射到 Java 对象。
我需要什么帮助
基本上,我只想要 3 个问题的答案:
问题 1: 我是否应该简单地恢复到有状态身份验证,因为无状态模型不适合我的用例场景?
问题 2 & 3 : StatelessSession 系统甚至可以在我的场景中实现吗,它会对数据库连接时间产生重大影响吗?
但是,当然,如果你知道任何其他线索可以帮助我解决我的问题,而不必将整个事情恢复到 Stateful,我会接受它!
终于有时间来回答了(以防以后有人路过)
基本上,我有两个选择:完全删除 Hibernate 或 "go back" 到有状态会话。
我选择了第一个选项,我只能这样做,因为我们的 java 对象和数据库之间没有基于注释的映射。 Going Stateful 可能是一种更好的方法,但我真的不知道该怎么做。我发现大量文章都在强调如何去无状态,但没有强调如何回到有状态,而且......好吧......向后做是不够的,因为我会错过很多配置,所以我'我必须研究它,这是一个我没有时间处理的麻烦。
使用 org.springframework.web.filter.GenericFilterBean 的自定义实现,我将每个传入请求包装在包含数据库连接的自定义 requestWrapper 中。 我使用 java(低)API 打开/创建所述连接:java.sql.DriverManager.getConnection
然后我可以从我的包装器中检索此连接,该连接由 Spring 通过应用程序使用此代码进行传输:
ServletRequestAttributes att = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes());
ContentCachingRequestWrapper springWrapper = (ContentCachingRequestWrapper) att.getRequest();
CustomWrapper myWrapper = (CustomWrapper) springWrapper.getRequest();
myWrapper.getConnection();
只是不要忘记正确关闭所有内容以避免内存泄漏,这样就可以了。 还需要正确注册驱动程序,只需在应用程序主 class.
中调用所述驱动程序的构造函数即可