Spring Security提供基础的用户验证服务。
Spring Security有效
compile("org.springframework.boot:spring-boot-starter-security:$springBootVersion")
认证
主要通过 UserDetailsService 来检索用户信息,从而实现用户的验证,
如果只是添加了上面的Security依赖包的话,SpringBoot默认提供了Basic级别的安全架构,
通过UserDetailsService,默认生成了用户-User,密码-随机数字(可以在info的log中看到)的访问权限和界面,此时访问api或者form时,会显示SpringBoot默认提供的login界面,输入正确,跳转到你请求的页面,输入错误,显示–Bad credentials,提示重新输入。
当然也可以通过设置
spring.security.user.name
spring.security.user.password
自定义自己的用户名和密码。—最简单的方式,也是最不安全的方式
文档 boot-features-security
Spring Security 提供了几种方式来自己实现验证用户。
InMemory方式
继承 WebSecurityConfigurerAdapter 类,重写认证管理的实现方式,
具体实现类是;InMemoryUserDetailsManager
@EnableWebSecurity
public class SpringSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
public void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("hoge").password("HOGE").roles("USER");
}
}
运行api请求看一下,输入指定 hoge / HOGE,发现登录不了,
参照 There is no PasswordEncoder mapped for the id “null”
原因是 SpringSecurity5 以上严格化了登陆密码的管理,即使是最简单的内存保存方式,也要求必须进行PasswordEncoder,最简单的解决办法是;
添加不使用Encoder的方式,当然只是单纯学习的话可以
@Bean
public static NoOpPasswordEncoder passwordEncoder() {
return (NoOpPasswordEncoder) NoOpPasswordEncoder.getInstance();
}
再次运行,实现自定义内存管理方式的登陆。
注意,由于cookie的存在,有可能下次请求时会不再出现登录窗口。
JDBC方式
通过DB管理的方式,
具体实现类是;JdbcUserDetailsManager
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// JDBC Type
auth.userDetailsService(userDetailService);
}
继承 userDetailService 新作User
@Service
public class AuthenticationService implements UserDetailsService {
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
if (username == null || "".equals(username)) {
throw new UsernameNotFoundException("Username is empty");
}
return adminsRepository.findByLoginId(username);
}