使用 Tomcat DataSourceRealm 的 JSF 项目表单认证
Posted
技术标签:
【中文标题】使用 Tomcat DataSourceRealm 的 JSF 项目表单认证【英文标题】:JSF project form authentication using Tomcat DataSourceRealm 【发布时间】:2013-07-31 01:05:15 【问题描述】:我有一个 JSF 2 项目,正在使用 Eclipse Inigo 作为 IDE,并部署到 Tomcat 6(它在 VirtualBox 的虚拟机中运行以模拟目标环境)。我没有使用 Eclipse 进行部署。现在我只是导出一个 .war 文件并从 Tomcat 管理器屏幕部署它。我正在使用 HSQLDB 来存储用户、密码和用户角色。让我感到困惑的一个项目要求是我的 Web 应用程序必须是完全独立的。也就是说,我交付了一个 .war 文件,他们无需对 Tomcat 进行额外配置即可将其插入。
我已经阅读了大量关于配置我的项目以进行表单身份验证的内容,包括:SO question 1、SO question 2、SO question 3、Tomcat Realm config、Java EE 6 security 等等。这些资源确实有助于理解如何配置我的项目。我以为我快到了。但是,当我部署 Web 应用程序并尝试访问受限页面时,我总是会收到登录错误页面。我尝试使用数据库中具有所需角色的各种用户之一登录,我认为数据库是根据Tomcat Documentation 设置的。
我读过的所有教程都与我的情况有所不同:
-
使用 Glassfish 代替 Tomcat
使用
BASIC
身份验证而不是FORM
将用户、密码和角色存储在 tomcat-users.xml
而不是关系数据库表中
在 server.xml
中声明角色,而不是在 .war 文件中的某个位置。
第 4 点尤其使我无法全面了解什么是可能的,什么是不可能的(开箱即用)。
稍后我将编辑此问题以发布代码(web.xml
等),但首先我想问一个类似于“SO 问题 2”(上文)中的问题,其中 OP 询问是否无需在应用程序服务器中定义某些内容就可以进行表单身份验证。在其中一个答案中,这听起来像是不可能的,但还不是很确定。
那么,是否可以在不修改服务器中的文件的情况下实现表单身份验证(特别是 server.xml
和 tomcat-users.xml
,如许多教程所示)?可以在 .war 完全自包含的要求下使用DataSourceRealm
进行表单身份验证吗?如果是这样,怎么做?我可以在我的 .war 中包含其他 .xml 文件来解决问题吗?我可以在web.xml
和context.xml
中包含我需要的所有内容吗?
我已经尝试在web.xml
和context.xml
中包含所有内容,但它不起作用。除了server.xml
文件中没有任何内容之外,我认为我已经正确配置了所有内容。
我暂时就这样吧。如果我需要的是可能的,我将使用代码进行编辑以试图找出我做错了什么,否则,我会省去麻烦。此外,如果使用表单身份验证无法满足我的需要,任何人都可以推荐一个好的替代方案来在自包含的 .war 中实现相同的目标吗? (由于没有更好的方式来描述它,我放弃了“自包含的 .war”这个词……如果有更好或更准确的术语,请告诉我。)
【问题讨论】:
【参考方案1】:很遗憾,你做不到。 领域是在 server.xml 文件中配置的,因此如果要针对数据库对用户进行身份验证,则必须在 server.xml 文件中对其进行配置。
如果您想根据数据库对用户进行身份验证并确保您的所有配置都在您的 WAR 文件中,请考虑使用 Spring Security 框架:http://static.springsource.org/spring-security/site/docs/3.1.x/reference/springsecurity-single.html 它是一个伟大而简单的框架,解决了很多身份验证/授权问题。
【讨论】:
感谢您的信息。我越是尝试不同的组合,但没有成功,我越怀疑这确实是不可能的。也感谢关于 Spring Security 的建议。我曾在 SO 的其他地方看到它与 Shiro 和 Seam 并排推荐。以上是关于使用 Tomcat DataSourceRealm 的 JSF 项目表单认证的主要内容,如果未能解决你的问题,请参考以下文章
使用 Tomcat 7 的 tomcat-maven-plugin - tomcat:deploy 有效,tomcat:undeploy 无效