我想問一些關於Spring Security中我的問題的幫助。 我有一個要求,我必須根據用戶選擇的選項驗證登錄憑證。選項1將通過第三方服務驗證登錄用戶。選項2將是使用數據庫認證級別的正常驗證。我怎樣才能實現這個?在Spring Security中實現自定義身份驗證
回答
總體戰略
- 提供
org.springframework.security.authentication.AuthenticationProvider
定製實現,鑑定委派到相應的後端(第三方服務,另一個AuthenticationProvider
等)。 - 將用戶選擇的選項傳遞給自定義
AuthenticationProvider
以使其能夠選擇正確的身份驗證後端。 - 將自定義
AuthenticationProvider
配置爲默認身份驗證提供程序。
步驟1:實施
AuthenticationProvider
AuthenticationProvider
是具有單個方法的接口。因此,自定義實現可能看起來像:
class DelegatingAuthenticationProvider implements AuthenticationProvider {
@Autowired
private ThirdPartyAuthenticationService service;
@Autowired
@Qualifier("anotherAuthenticationProvider")
private AuthenticationProvider provider;
@Override
public Authentication authenticate(final Authentication authentication) throws AuthenticationException {
// Get the user selection.
String selection = (String) authentication.getDetails();
// Take action depending on the selection.
Authentication result;
if("ThirdParty".equals(selection)) {
// Authenticate using "service" and generate a new
// Authentication "result" appropriately.
}
else {
// Authenticate using "provider" and generate a new
// Authentication "result" appropriately.
}
return result;
}
}
步驟2:將用戶選擇的
AuthenticationProvider
的AuthenticationProvider
執行上述從的details
屬性拾取所述用戶選擇Authentication
對象。據推測,用戶選擇必須從HttpServletRequest
中選取,並在調用AuthenticationProvider
之前將其添加到Authentication
對象。這意味着,另一個組件可以訪問Authentication
和HttpServletRequest
對象,並在需要實施AuthenticationProvider
之前調用。
Authentication
對象是通過執行AbstractAuthenticationProcessingFilter
創建的。該類有一個名爲attemptAuthentication
的方法,它接受一個HttpServletRequest
對象並返回一個Authentication
對象。所以看起來這將是一個很好的候選人來實施需要的東西。對於基於用戶名 - 密碼的認證,實施等級爲UsernamePasswordAuthenticationFilter
。該類返回UsernamePasswordAuthenticationToken
的新實例,該實例是Authentication
的實現。所以,擴展UsernamePasswordAuthenticationFilter
的類應該足夠了。
class ExtendedUsernamePasswordAuthenticationFilter extends UsernamePasswordAuthenticationFilter {
@Override
public Authentication attemptAuthentication(HttpServletRequest request, HttpServletResponse response) throws AuthenticationException {
...
UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(username, password);
authentication.setDetails(obtainUserSelection(request));
...
return authentication;
}
}
obtainUserSelection
是一種私人方法,可以將用戶選擇從請求中提取出來。
第3步:配置
配置在春季安全配置AuthenticationProvider
和濾波器實現。具體步驟取決於是使用XML還是Java配置。
- 1. 在Spring Security中自定義身份驗證
- 2. Spring Security中的自動身份驗證
- 3. 實現自定義身份驗證(MVC5)
- 4. Spring Security + Ldap身份驗證
- 5. 在Spring Security中實現PKI身份驗證
- 6. Grails spring-security-facebook插件 - 自定義客戶端身份驗證
- 7. 自定義身份驗證過濾器Spring Security 3.2
- 8. Spring Security 3.0-自定義基本http身份驗證對話框
- 9. Spring Security 3自定義身份驗證要求....需要幫助!
- 10. Spring Security自定義身份驗證和密碼編碼
- 11. Spring Security自定義身份驗證並記住我
- 12. 使用Acegi/Spring Security創建自定義身份驗證
- 13. Spring MVC自定義身份驗證
- 14. 如何實現Spring Security「摘要式身份驗證」
- 15. Spring Boot REST API/Spring Security:身份驗證失敗時返回自定義消息
- 16. Spring Security的授權和身份驗證
- 17. Spring Security - 身份驗證沒有啓動
- 18. Spring Security詢問身份驗證問題
- 19. Spring Security和JSON身份驗證
- 20. Spring Security和LDAP MD5身份驗證
- 21. 的Spring Security和LDAP身份驗證
- 22. Spring-Security DAOAuthenticationProvider要求身份驗證
- 23. Spring Security Web Service身份驗證
- 24. 在Laravel中自定義身份驗證
- 25. 在CakePHP中自定義身份驗證
- 26. 如何在OData上實現自定義身份驗證
- 27. Spring Security自定義身份驗證失敗處理程序重定向參數
- 28. 如何使用spring-security-core-ldap插件在grails中實現LDAP身份驗證?
- 29. 在Spring Security中實現基本身份驗證後總是收到401錯誤
- 30. 使用spring-security-core-ldap插件在grails中實現LDAP身份驗證?
哇..感謝manish!這是一個學習春季安全的好機會。順便說一句,這是我第一次實施。你能指點我一個關於實現ExtendedUsernamePasswordAuthenticationFilter的教程網站嗎?請:) –
您可以查看[UsernamePasswordAuthenticationFilter'的官方實現](https://github.com/spring-projects/spring-security/blob/master/web/src/main/java/org/springframework/security /web/authentication/UsernamePasswordAuthenticationFilter.java)。 – manish