前言
Digest(摘要) 认证是在请求接口之前要输入账号密码,是在Basic认证传输账号密码的基础上加密
SpringBoot整合Digest
pom.xml
<dependencies>
<!-- spring boot security -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
<!-- spring boot web -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- spring boot 单元测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
</dependencies>
启动类
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class App{
public static void main(String[] args) {
SpringApplication.run(App.class, args);
}
}
控制层
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
* test 控制层
* @author terry
* @version 1.0
* @date 2022/6/10 11:26
*/
@RestController
public class TestCtrl {
@RequestMapping("/test")
public String test(){
return "success";
}
}
Digest 摘要认证基本配置类
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.security.crypto.password.NoOpPasswordEncoder;
import org.springframework.security.web.authentication.www.DigestAuthenticationEntryPoint;
import org.springframework.security.web.authentication.www.DigestAuthenticationFilter;
import java.util.ArrayList;
import java.util.List;
@Configuration
@EnableWebSecurity
public class DigestSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest().authenticated()
.and()
.addFilter(digestAuthenticationFilter())
.exceptionHandling()
.authenticationEntryPoint(digestAuthenticationEntryPoint());
}
@Bean
public DigestAuthenticationEntryPoint digestAuthenticationEntryPoint() {
DigestAuthenticationEntryPoint point = new DigestAuthenticationEntryPoint();
point.setRealmName("terry");
point.setKey("terry123");
return point;
}
@Bean
public DigestAuthenticationFilter digestAuthenticationFilter() {
DigestAuthenticationFilter filter = new DigestAuthenticationFilter();
filter.setAuthenticationEntryPoint(digestAuthenticationEntryPoint());
filter.setUserDetailsService(userDetailsService());
return filter;
}
/**
* 在Spring security 5 之后需要设置密码解析器,
* 如果不设置会报错,一般情况下会用Md5.本文采用的无密码验证
* @return
*/
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
@Override
@Bean
public UserDetailsService userDetailsService() {
return new UserDetailsService() {
//用户摘要
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//省略从数据库查询过程
String password = "terry123";
List<GrantedAuthority> authorities = new ArrayList<>();
authorities.add(new SimpleGrantedAuthority("auth"));
return new User(username, password, true, true, true, true, authorities);
}
};
}
}
测试
浏览器访问:http://localhost:8080/test

输入用户名:terry,密码:terry123,即可访问接口。

与Basic认证不同的是,Digest认证请求头Authorization中的数据复杂的多。
版权声明:本文为qq_37493888原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。