添加依赖:Spring Boot Starter Security
我们在进行操作之前必须要先登录
这时无论访问那个地址,都会自动跳转到login地址
在idea控制台中会有登录的密码,由 Spring Security
定义生成的。
如何将数据库中的数据作为登录账号和密码?
当什么也没有配置的时候,账号和密码是由 Spring Security
定义生成的。而在实际项目中账号和密码都是从数据库中查询出来的。所以我们要通过自定义逻辑控制认证逻辑。如果需要自定义逻辑时,只需要实现 UserDetailsService
接口即可。
- 从
UserDetailsService
中可以读取登录填写的String变量,就是我们输入的用户名。 - 利用
QueryWrapper
和UserMapper
判断数据库中是否有该username - 如果有的话返回一个新的User,将这个新的User传递给
UserDetails
,UserDetails
可以通过User新建一个登录的用户
UserDetails和UserDetailsService是什么?
两个接口
UserDetails
:提供用户核心信息,登录之后,根据登录的用户名和密码,查询到的对应用户信息和权限信息。
UserDetailsService
:自定义用户的登录逻辑。
下面是代码实现——通过数据库中每个user的username和password进行登录
@Service
//千万不能忘了Service
//@Service注解用于类上,标记当前类是一个service类,加上该注解会将当前类自动注入到spring容器中,不需要再在applicationContext.xml文件定义bean了。
//自动扫描路径下面的包的时候,如果一个类带了@Service注解,将自动注入到Spring容器类似的还包括@Component、@Repository、@Controller。
//用人话说就是加了@Service后spring就会运行该类中的代码
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserMapper userMapper;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//username就是在网址中填入的用户名
QueryWrapper<User> queryWrapper = new QueryWrapper<>();
queryWrapper.eq("username", username); //查找相同的用户名是否存在
User user = userMapper.selectOne(queryWrapper);
if (user == null) {
throw new RuntimeException("用户不存在");
}
return new UserDetailsImpl(user); //给UserDetails一个User,创建一个新的登录用户
}
}
//不要忘记构造函数和set、get之类的,可以用lombok包快速实现
@Data
@NoArgsConstructor
@AllArgsConstructor
//创建了一个以User的username和password为用户名和密码的账户,这样我们就可以直接登录啦
public class UserDetailsImpl implements UserDetails {
User user;
//获取所有权限
@Override
public Collection<? extends GrantedAuthority> getAuthorities() {
return null;
}
//获取密码
@Override
public String getPassword() {
return user.getPassword();
}
//获取用户名
@Override
public String getUsername() {
return user.getUsername();
}
//账户是否过期
@Override
public boolean isAccountNonExpired() {
return true;
}
//账户是否被锁
@Override
public boolean isAccountNonLocked() {
return true;
}
//凭证是否过期 密码是否过期
@Override
public boolean isCredentialsNonExpired() {
return true;
}
//账户是否可用
@Override
public boolean isEnabled() {
return true;
}
}