Spring Security 3.1 - Менеджеры множественной аутентификации - выполнение действия зависит от успешного метода
У меня есть это в моем app-security.xml, и я хочу выполнить некоторые задачи, если пользователь был зарегистрирован в LDAP, другие задачи, если пользователь был зарегистрирован в БД и т. Д.
<ldap-server url="ldap://192.168.0.55:389/dc=fluxit,dc=com,dc=ar"
manager-dn="uid=admin,ou=system"
manager-password="infra123"
/>
<authentication-manager>
<authentication-provider user-service-ref='databaseAuthManager'>
<password-encoder ref="encoder" />
</authentication-provider>
<authentication-provider>
<password-encoder ref="encoder" />
<user-service id="textFileAuthManager" properties="classpath:auth/users.properties" />
</authentication-provider>
<ldap-authentication-provider
user-search-filter="(uid={0})" user-search-base="ou=users"
group-search-filter="(uniqueMember={0})" group-search-base="ou=groups"
group-role-attribute="cn" role-prefix="ROLE_">
</ldap-authentication-provider>
</authentication-manager>
Могу ли я сделать это весной? Я некоторое время гуглил и не нашел ответа.
Спасибо вам большое!
1 ответ
Я думаю, что проблема с вашим требованием состоит в том, что менеджер аутентификации не сохраняет информацию о том, какой конкретный поставщик аутентификации действительно аутентифицировал запрос. Если бы у вас была эта часть информации, вы могли бы легко написать AuthenticationSuccessHandler
реализовать некоторое поведение, которое зависит от метода аутентификации, который был успешным.
Если вам действительно нужна эта функциональность, вот одно из возможных решений, которое я мог бы предложить: ProviderManager
это обернуло бы объект аутентификации декоратором, который сохраняет ссылку на успешного провайдера аутентификации. С момента реализации ProviderManager
не предлагает точек расширения, которые вы могли бы использовать для этого, вам, в основном, нужно скопировать весь класс, чтобы внести необходимые улучшения. Тогда вам придется переписать весь <authentication-manager>
часть вашей конфигурации без использования пространства имен безопасности, потому что это не позволяет вам заменить стандартное AuthenticationManager
реализация.
Это не слишком элегантное и не очень простое решение, поэтому могут быть и более эффективные способы сделать это.