我有一个安装了spring安全性的应用程序并且运行良好 - 它目前用完了www.exampledomain.com
。
我现在想要扩展从子域运行的应用程序。例如newapp.exampledomain.com
。
唯一的问题是,对于这个新应用,用户需要登录。在春季,通过<intercept-url pattern="/Admin/*" access="ROLE_GENERAL"/>
但是当您想要拦截子域以进行登录时,您会怎么做?例如,以下内容对我不起作用:
<intercept-url pattern="http://newapp.exampledomain.com/*" access="ROLE_GENERAL"/>
有关如何解决这个问题的想法吗?
答案 0 :(得分:2)
一种选择是编写自己的AccessDecisionVoter,扩展RoleVoter并根据主机名添加额外的检查。像这样:
public class MyVoter extends RoleVoter {
public int vote(Authentication authentication,
java.lang.Object object,
java.util.Collection<ConfigAttribute> attributes) {
FilterInvocation filterInvocation = (FilterInvocation) object;
HttpRequest request = filterInvocation.getHttpRequest();
// get subdomain from request
String subdomain = getSubdomain(request);
if ("free".equals(subdomain)) {
return ACCESS_GRANTED;
}
else {
super.vote(authentication, object, attributes);
}
}
}
然后给你的选民打电话:
<security:http auto-config="true"
use-expressions="true"
access-decision-manager-ref="accessDecisionManager">
...
</security:http>
<bean id="accessDecisionManager"
class="org.springframework.security.access.vote.UnanimousBased">
<property name="decisionVoters">
<list>
<bean class="com.acme.MyVoter" />
</list>
</property>
</bean>
如果您想更进一步,您还可以编写自己的configuration attributes,这样您就可以删除选民中的硬编码主机名检查,并执行以下操作:
<intercept-url pattern="/Admin/*" access="ROLE_GENERAL" domain="free.acme.com" />
答案 1 :(得分:1)
在您的会话Cookie中,域名应明确设置为exampledomain.com。
应用程序服务器负责创建会话cookie(JSESSIONID),但不负责Spring Security。
您所要做的就是通知您的应用服务器您希望在Cookie中始终拥有相同的域。
添加到您的web.xml:
<session-config>
<cookie-config>
<domain>exampledomain.com</domain>
</cookie-config>
</session-config>