添加子域到 spring 安全认证
Adding sub domains to spring security authentication
我正在尝试构建一个云解决方案,它将作为子域上的一个完全不同的应用程序运行。我现在面临的问题是在注册和登录期间处理这个子域。我们使用 spring 表单登录进行登录。注册的每个用户都应仅被视为该特定子域的用户,不应允许他从另一个子域登录。所有的子域都是动态创建的子域。
例如,姓名为 "shrek" 且在 "ogre.mydomain.com" 拥有帐户的用户不应被允许从 "human.mydomain.com" 登录,除非从 "human.mydomain.com" 注册具有相同的名称或不同的名称。
我试过的
我尝试将子域与用户相关联,并在登录期间通过将子域附加到用户名来验证用户。
这种方法的问题是每次我在我的控制器中请求主体时,我都会将域作为用户名的一部分。
我只是想知道是否有更好的方法来做到这一点。
您应该做的不是在用户名中使用子域,而是应该为每个子域分配一个角色。
当用户在 ogre.mydomain.com
中注册名为 shrek
时,该用户将自动获得名为 ROLE_OGRE_USER
的角色并具有以下 spring 安全限制。
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 ("ogre".equals(subdomain)) {
if(authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_OGRE_USER"))) {
return ACCESS_GRANTED;
} else {
return ACCESS_DENIED;
}
}
else {
return 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="MyVoter" />
</list>
</property>
读这个SO post
我正在尝试构建一个云解决方案,它将作为子域上的一个完全不同的应用程序运行。我现在面临的问题是在注册和登录期间处理这个子域。我们使用 spring 表单登录进行登录。注册的每个用户都应仅被视为该特定子域的用户,不应允许他从另一个子域登录。所有的子域都是动态创建的子域。
例如,姓名为 "shrek" 且在 "ogre.mydomain.com" 拥有帐户的用户不应被允许从 "human.mydomain.com" 登录,除非从 "human.mydomain.com" 注册具有相同的名称或不同的名称。
我试过的
我尝试将子域与用户相关联,并在登录期间通过将子域附加到用户名来验证用户。
这种方法的问题是每次我在我的控制器中请求主体时,我都会将域作为用户名的一部分。
我只是想知道是否有更好的方法来做到这一点。
您应该做的不是在用户名中使用子域,而是应该为每个子域分配一个角色。
当用户在 ogre.mydomain.com
中注册名为 shrek
时,该用户将自动获得名为 ROLE_OGRE_USER
的角色并具有以下 spring 安全限制。
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 ("ogre".equals(subdomain)) {
if(authentication.getAuthorities().contains(new SimpleGrantedAuthority("ROLE_OGRE_USER"))) {
return ACCESS_GRANTED;
} else {
return ACCESS_DENIED;
}
}
else {
return 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="MyVoter" />
</list>
</property>
读这个SO post