We will start with What Digest Authentication is and then do project setup and run the example using postman.
Let's start building simple Spring Boot application with Digest Authentication using Spring Security.
We will use spring-boot-starter-security as maven dependency for Spring Security.
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
@Bean
DigestAuthenticationFilter digestFilter(DigestAuthenticationEntryPoint digestAuthenticationEntryPoint, UserCache digestUserCache, UserDetailsService userDetailsService) {
DigestAuthenticationFilter filter = new DigestAuthenticationFilter();
filter.setAuthenticationEntryPoint(digestAuthenticationEntryPoint);
filter.setUserDetailsService(userDetailsService);
filter.setUserCache(digestUserCache);
return filter;
}
@Bean
UserCache digestUserCache() throws Exception {
return new SpringCacheBasedUserCache(new ConcurrentMapCache("digestUserCache"));
}
@Bean
DigestAuthenticationEntryPoint digestAuthenticationEntry() {
DigestAuthenticationEntryPoint digestAuthenticationEntry = new DigestAuthenticationEntryPoint();
digestAuthenticationEntry.setRealmName("BLOG.GAURAV.CC");
digestAuthenticationEntry.setKey("Sup3rSecret");
digestAuthenticationEntry.setNonceValiditySeconds(60);
return digestAuthenticationEntry;
}
You need to register DigestAuthenticationFilter in your spring context. DigestAuthenticationFilter requires DigestAuthenticationEntryPoint and UserDetailsService to authenticate user.
The purpose of the DigestAuthenticationEntryPoint is to send the valid nonce back to the user if authentication fails or to enforce the authentication.
The purpose of UserDetailsService is to provide UserDetails like password and list of role for that user. UserDetailsService is an interface. I have implemented it with DummyUserDetailsService which loads every passed userName's details. But, you can restrict it to some few user or make it Database backed. One thing to remember is the password passed need to be in plain text format here. You can also use InMemoryUserDetailsManager for storing handful of user configured either through Java configuration or with xml based configuration which could access your application.
In the example, I also have used the caching for UserDetails. I have used SpringBasedUserCache and underlying cache is ConcurrentMapCache. You can use any other caching solution of your choice.
You can download the example code from Github. I will be using Postman to run the example. Here are the few steps you need to follow.
localhost:8082).
WWW-Authenticate header. Copy the value of nonce field and enter in the nonce textfield.
This is how we implement Digest Authentication with Spring Security. I hope you find this post informative and helpful.