zoukankan      html  css  js  c++  java
  • Spring Security认证提供程序

    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的项目,因此它应该很容易导入和运行。

  • 相关阅读:
    Python学习笔记:List类型所有方法汇总
    Python学习笔记:String类型所有方法汇总
    制作“铜墙铁壁”一样的比特币冷钱包的完整流程详解!!
    jpa教程+ 常见的jpa报错以及解决方式
    Hibernate之mappedBy与@JoinColumn
    什么是JPA?Java Persistence API简介
    一文搞懂并发和并行
    清华大学操作系统【mark下】
    一文足以了解什么是 Java 中的锁.
    JDK8日常开发系列:Consumer详解
  • 原文地址:https://www.cnblogs.com/xjknight/p/10884857.html
Copyright © 2011-2022 走看看