2015-09-09 107 views
0

我正在嘗試構建一個雲解決方案,它將在子域上表現爲完全不同的應用程序。我現在面臨的問題是在註冊和登錄過程中處理這些子域。我們使用Spring表單登錄進行登錄。每個註冊的用戶都應該被視爲僅用於該特定子域的用戶,並且他不應該被允許從另一個子域登錄。所有的子域都是動態創建的子域。向spring安全認證添加子域

例如,在「ogre.mydomain.com」中擁有帳戶的名爲「shrek」的用戶不應該被允許從「human.mydomain.com」登錄,除非從「human.mydomain .com「同名或不同的名稱。

我已經試過

我試圖子域用戶相關聯,並且通過在登錄過程中附加的子域的用戶名驗證用戶。

這種方法的問題是每次我要求我的控制器中的主體時,我將域作爲用戶名的一部分。

我只是想知道是否有更好的方法來做到這一點。

回答

1

你應該做的是,而不是在用戶名中使用子域,你應該做的是爲每個子域都有一個角色。

當用戶在ogre.mydomain.com中註冊名爲shrek時,那麼該用戶將自動獲得一個名爲ROLE_OGRE_USER的角色,並具有以下彈簧安全性限制。

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