[Spring boot + Spring Security] Security with Digest Authentication

1. Prepare Tools

  • IDE: Netbean 8.2
  • JDK: 1.8
  • Maven: 3.5.0

2. Target

Build project thỏa mãn các yêu cầu sau:

  • Sử dụng spring boot + spring security
    
  • Sử dụng digest authentication để bảo mật tài nguyên qua http
    
  • Sử dụng annotation configuration thay cho xml configuration.
    

3. Maven dependency

        <!-- Core starter, including auto-configuration support, logging and YAML -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- Starter for using Spring Security -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <!-- Starter for building web, including RESTful, applications using Spring MVC. Uses Tomcat as the default embedded container -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-thymeleaf</artifactId>
        </dependency>

4. Project setup and description

1. Basic Project

https://viblo.asia/p/spring-boot-spring-security-basic-project-1VgZvEmpKAw

2. Digest Authentication

Tương tự như Basic Authentication, Digest Authentication cũng là một tiêu chuẩn bảo vệ tài nguyên qua http. Khác với Basic, Digest bảo mật hơn bằng cách ngăn chặn được việc decode chuỗi Authorization trên header của bản tin http. Cụ thể quá trình xác thực như thế nào thì mọi người google nhé.

3. DigestAuthenticationFilter

Tương tự như Basic Authentication, việc xử lý digest authen cũng được thông qua một filter. Sping cũng hỗ trợ luôn một class làm chức năng trên DigestAuthenticationFilter

    DigestAuthenticationFilter digestAuthenticationFilter() throws Exception {
        DigestAuthenticationFilter digestAuthenticationFilter = new DigestAuthenticationFilter();
        digestAuthenticationFilter.setUserDetailsService(userDetailsService);
        digestAuthenticationFilter.setAuthenticationEntryPoint(digestEntryPoint());
        return digestAuthenticationFilter;
    }

3. DigestAuthenticationEntryPoint

Tương tự Basic Authentication, Digest cũng cần một cái entryEndpoint để xây dựng cấu trúc header response lại client cho đúng flow. Spring cũng hỗ trợ luôn một class làm việc này

    @Bean
    DigestAuthenticationEntryPoint digestEntryPoint() { 
        DigestAuthenticationEntryPoint dAuth = new DigestAuthenticationEntryPoint();
        dAuth.setRealmName("soithatha");
        return dAuth;
    }

Việc của chúng ta là dùng lại.

4. SecurityConfig

Add thêm filter vào trong cấu hình httpsecurity

  http.addFilter(digestAuthenticationFilter()) 
                .exceptionHandling().authenticationEntryPoint(digestEntryPoint()) 
                .and()
                .authorizeRequests()
                .antMatchers("/login").permitAll() 
                .anyRequest().authenticated()

5. Demo

6. Full Source

spring-security-digest-authentication http://123link.vip/jgEZ5S3