有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java向spring安全认证添加子域

我正在尝试构建一个云解决方案,它将在一个子域上表现为一个完全不同的应用程序。我现在面临的问题是在注册和登录期间处理这些子域。我们使用spring表单登录。每个注册的用户都应该被视为该特定子域的用户,不应该允许他从另一个子域登录。所有子域都是动态创建的子域

例如,在“ogre.mydomain.com”中拥有帐户的名为“史瑞克”的用户不应被允许从“human.mydomain.com”登录,除非使用相同或不同的名称从“human.mydomain.com”注册

我尝试过的

我尝试将子域与用户关联,并在登录时通过将子域附加到用户名来验证用户

这种方法的问题是,每次我在控制器中请求委托人时,我都会将域作为用户名的一部分

我只是想知道是否有更好的方法


共 (1) 个答案

  1. # 1 楼答案

    你应该做的不是在用户名中使用子域,而是为每个子域指定一个角色

    当一个用户在名为ogre.mydomain.comshrek中注册时,该用户将自动获得名为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