我们有一个使用两个域名的grails应用程序,Tomcat配置为使用虚拟主机和别名。这是server.xml片段:
<Host name="domain1.com" appBase="myApp"
unpackWARs="true" autoDeploy="true"
xmlValidation="false" xmlNamespaceAware="false">
<Alias>domain2.com</Alias>
</Host>
我们还希望限制对Web应用程序的访问(与登录以使用该站点不同),因此我们使用了Tomcat安全性。
以下是应用程序web.xml中的安全约束代码段:
<security-constraint>
<web-resource-collection>
<web-resource-name>HTMLManger and Manager command</web-resource-name>
<url-pattern>/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<!-- NOTE: This role is not present in the default users file -->
<role-name>manager</role-name>
</auth-constraint>
</security-constraint>
<!-- Define the Login Configuration for this Application -->
<login-config>
<auth-method>BASIC</auth-method>
<realm-name>My Realm</realm-name>
</login-config>
<!-- Security roles referenced by this web application -->
<security-role>
<description>
The role that is required to log in to the Manager Application
</description>
<role-name>manager</role-name>
</security-role>
<error-page>
<error-code>401</error-code>
<location>/401.jsp</location>
</error-page>
所以这是场景:当用户浏览到domain1.com时,将显示基本身份验证弹出窗口。然后,用户输入用户名和密码组合以进入该站点。然后,用户希望登录Web应用程序(以便能够使用更多功能)。登录机制(使用acegi)也需要登录domain2.com。现在,在用户登录到domain2.com之前,他/她需要为基本身份验证弹出窗口输入相同的凭据。基本上,用户需要两次使用tomcat web安全性,这是我们需要避免的。
问题还在于,由于它是同一个网络应用程序,为什么需要用户登录两次?是因为tomcat web安全是基于域的吗?那么,即使其他域只是原始域的别名?
谢谢!
答案 0 :(得分:1)
我认为问题在于auth基于域上的会话和会话。 如果您有两级身份验证系统,您应该考虑使用SSO这样的CAS。已弃用的Acegi插件和用于grails的新Spring Security插件都支持CAS。在互联网网站场景中,OpenID也可以是一个简单而便宜(免费)的选项。具有更细粒度角色建模的一级auth系统也可以选择