2013-11-12 2 views
0

Я новичок в grails, и я пытаюсь реализовать пружинное ядро ​​безопасности и многопользовательский одноплатный плагин db. Я реализовал первое ядро ​​безопасности весной и внедрил пользовательский AuthenticationProvider и Authentication. Затем я установил многопользовательский одиночный плагин db и запустил скрипт «mt-spring-security», который автоматически создавал пользовательские tenantResolver и tenantRepository. Для тестирования я жестко закодировал tenantId в tenantResolver. Я добавил аннотацию @MultiTenant в классы домена.Grails 2.2.3 + Весовое ядро ​​безопасности + Multi-tenant Single DB plugin

@MultiTenant

класс реализует Serializable-Клиент {

long idclient_user 
Userprofile user 
Client client 
int tenantId 
... 

}

В AuthenticationProvider, данные не-Клиент фильтруется для текущего арендатора. Он приносит данные всем арендаторам.

класс ClientAuthenticationProvider реализует AuthenticationProvider {

Authentication authenticate(Authentication auth) throws AuthenticationException { 
    ClientAuthentication authentication = auth 
    String password = authentication.credentials 
    String username = authentication.name 
    String clientName = authentication.clientName 
    ... 
    Userprofile.withTransaction { status -> 

     def user = Userprofile.findWhere(username: username) 
     def client = Client.findWhere(clientname: clientName) 
     def clientUser = ClientUser.findWhere(client: client, user: user) <-- NOT FILTERED FOR THE CURRENT TENANT. I HARD-CODED INVALID TENANTID IN THE TENANTRESOLVER AND EXPECTING IT TO FAIL BUT IT STILL FINDS THE USER. 

     if (!clientUser) { 
      throw new UsernameNotFoundException('User not found', username) 
     } 
     ... 
    } 
    ... 
    result 
} 

Я не знаю, как многопользовательские и весна безопасность работают вместе. Мне трудно понять Архитектуру/дизайн.

Если бы кто-нибудь мог предоставить мне пример реализации или указать мне в правильном направлении, это будет действительно полезно. Спасибо, dinesh

ответ

0

Проблема заключалась в том, что фильтр мультикана был зарегистрирован до фильтра безопасности пружины, поэтому tenantResolver не вызывался только после проверки подлинности Spring. Я зафиксировал эту проблему путем установки resolveTenantBeforeLogin истины в Config.groovy

В Config.groovy, добавьте эту строку

multiTenant.resolveTenantBeforeLogin = истинную

После того, как я добавил эту линию, то tenantResolver называется сначала, а затем аутентификацию.

Смежные вопросы