添加子域到 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