1. 简介
本教程将介绍如何在 Spring Security 中设置身份验证提供程序, 与使用简单 UserDetailsService 的标准方案相比, 提供了额外的灵活性.
2. The Authentication Provider
Spring Security 提供了多种执行身份验证的选项 - 所有这些都遵循简单的规范 - 身份验证请求由 Authentication Provider 处理, 并且返回具有完整凭据的完全身份验证的对象.
标准和最常见的实现是 DaoAuthenticationProvider - 它从一个简单的只读用户 DAO 检索用户详细信息 - UserDetailsService. 此 UserDetailsService 只能访问用户名, 用来检索完整的用户实体 - 在很多情况下, 这就足够了.
更多常见的场景仍然需要访问完整的身份验证请求才能执行身份验证过程. 例如, 在针对某些外部第三方服务 (例如 Crowd) 进行身份验证时, 将需要来自身份验证请求的用户名和密码.
对于这些更高级的方案, 我们需要定义自定义身份验证提供程序:
- @Component
- public class CustomAuthenticationProvider
- implements AuthenticationProvider {
- @Override
- public Authentication authenticate(Authentication authentication)
- throws AuthenticationException {
- String name = authentication.getName();
- String password = authentication.getCredentials().toString();
- if (shouldAuthenticateAgainstThirdPartySystem()) {
- // use the credentials
- // and authenticate against the third-party system
- return new UsernamePasswordAuthenticationToken(
- name, password, new ArrayList<>());
- } else {
- return null;
- }
- }
- @Override
- public boolean supports(Class<?> authentication) {
- return authentication.equals(
- UsernamePasswordAuthenticationToken.class);
- }
- }
请注意, 在返回的 Authentication 对象上设置的授予权限是空的 - 这是因为权限当然是特定于应用程序的.
3. 注册 Authentication Provider
既然定义了身份验证提供程序, 我们需要使用可用的命名空间支持在 xml 安全配置中指定它:
- <?xml version="1.0" encoding="UTF-8"?>
- <beans:beans
- xmlns="http://www.springframework.org/schema/security"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xmlns:beans="http://www.springframework.org/schema/beans"
- xsi:schemaLocation="
- http://www.springframework.org/schema/security
- http://www.springframework.org/schema/security/spring-security-4.0.xsd
- http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-4.2.xsd">
- <http use-expressions="true">
- <intercept-url pattern="/**" access="isAuthenticated()"/>
- <http-basic/>
- </http>
- <authentication-manager>
- <authentication-provider
- ref="customAuthenticationProvider" />
- </authentication-manager>
- </beans:beans>
- 4. Java Configuration
接下来, 我们来看看相应的 Java 配置:
- @Configuration
- @EnablewebSecurity
- @ComponentScan("org.baeldung.security")
- public class SecurityConfig extends WebSecurityConfigurerAdapter {
- @Autowired
- private CustomAuthenticationProvider authProvider;
- @Override
- protected void configure(
- AuthenticationManagerBuilder auth) throws Exception {
- auth.authenticationProvider(authProvider);
- }
- @Override
- protected void configure(HttpSecurity http) throws Exception {
- http.authorizeRequests().anyRequest().authenticated()
- .and()
- .httpBasic();
- }
- }
5. 测试认证
无论是否在后端使用此自定义身份验证提供程序, 从客户端请求身份验证基本相同 - 我们可以使用简单的 curl 命令发送经过身份验证的请求:
- curl --header "Accept:application/json" -i --user user1:user1Pass
- http://localhost:8080/spring-security-custom/API/foo/1
请注意 - 出于本示例的目的 - 我们已使用基本身份验证保护 REST API.
我们从服务器返回预期的 200 OK
- HTTP/1.1 200 OK
- Server: Apache-Coyote/1.1
- Set-Cookie: JSESSIONID=B8F0EFA81B78DE968088EBB9AFD85A60; Path=/spring-security-custom/; HttpOnly
- Content-Type: application/JSON;charset=UTF-8
- Transfer-Encoding: chunked
- Date: Sun, 02 Jun 2013 17:50:40 GMT
六, 总结
在本文中, 我们讨论了 Spring Security 的自定义身份验证提供程序的示例.
可以在 GitHub 项目中找到本教程的完整实现 - 这是一个基于 Maven 的项目, 因此它应该很容易导入和运行.
来源: https://www.cnblogs.com/xjknight/p/10884857.html