SpringSecurity:认证
Posted 刚刚好。
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了SpringSecurity:认证相关的知识,希望对你有一定的参考价值。
快速入门
1.引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-security</artifactId>
</dependency>
2.编写controller
@RestController
public class HelloController{
@GetMapping("/hello")
public String hello(){
return "hello world";
}
}
启动项目后。我们发现访问\'/hello\'接口,会自动跳转到\'/login\'界面
下面我们来看一下这个流程
用户的生成
我们先来看一下spring security默认的用户生成
Spring Security使用UserDetailsService接口向认证器传入一个User实例(org.springframework.security.core.userdetails.User,有三个参数name,password,roles)
public interface UserDetailsService{
UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;
}
loadUserByUsername有一个参数username接收用户认证时传入的用户名,开发中一般我们需要自定义实现UserDetailsService
Spring Security也为UserDetailsService提供了默认实现,InMemoryUserDetailsManager就是一种基于内存的实现。
默认情况下,Spring Security会提供一个InMemoryUserDetailsManager实例,可以通过SecurityPropertes类的getUser()方法获取到一个User实例(org.springframework.security.core.userdetails.User)
@configurationProperties(profix="spring.security") //加载配置文件,因此可以在配置文件中指定账号密码
public class SecurityProperties{
private User user=new User();
public User getUser(){
return this.user;
}
public static class User{
private String name="user";
private String password=UUID.randomUUID().toString();
private List<String> roles=new ArrayList<>();
}
}
可以看到默认账号为user,密码为一串随机的UUID。同时,默认的密码会由getOrDeducePassword方法进行加密,如果没有指定加密方法,则只是会加一个前缀{noop}表明是明文存储。
自定义从数据库获取用户
//注意注册为bean交给容器管理
@Component
public class UserDateService implements UserDetailsService {
@Autowired
UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String phone) throws UsernameNotFoundException {
//这是通过username查询获取一组数据将获得的数据传给security的User
com.wang.pojo.User user = userMapper.getUserByPhone(phone);
if (user == null) {
throw new UsernameNotFoundException("该用户不存在!");
}
//把获得的账号密码传给security的User
return new User(user.getPhone(), user.getPassword(), new ArrayList<>());
}
}
以上是关于SpringSecurity:认证的主要内容,如果未能解决你的问题,请参考以下文章