1.创建项目在这里插入图片描述

2.项目创建成功以后,如何查看security已经在项目中生效呢?

启动项目,并在打开浏览器,输入:http://localhost:8080/login
就会出现security默认的登陆页面
在这里插入图片描述
用户名是user,密码在我们的控制台已经输出
在这里插入图片描述

3.UserDetailsService登陆逻辑跟PasswordEncoder密码解析器

在实际开发中我们会有很多不同的用户,用户跟用户名都会存在数据库里,然后我们去数据库里面在去查询,去判断用户名跟密码是否正确,那我们先看第一个类UserDetailsService(在键盘上连续两下shift全局搜索)
在这里插入图片描述
security默认使用的登陆逻辑就是用这个UserDetailsService接口来实现的,里面有一个方法loadUserByUsername,就是使用这个方法去实现登陆逻辑的
在这里插入图片描述
loadUserByUsername这个方法跟我们传统的方法不太一样,传统的方式是根据用户输入的用户名跟密码来去进行判断,而这里只是判断来用户名。那这是怎么回事呢?我们看这个方法的返回值类型UserDetails
在这里插入图片描述在这里插入图片描述
UserDetails这个类是一个接口,而我们在实际的开发中肯定不可能去new这个接口,所以我们就要去查看他的实现类,有三个实现类,但是我们主要是用这个user来实现
在这里插入图片描述
这个user是security的user,不是我们自己的user,不要混淆
在这里插入图片描述
看到user中有构造参数,构造参数需要传入password,这就涉及到密码的比较,我们全局搜索PasswordEncoder
在这里插入图片描述
在这里插入图片描述
PasswordEncoder也是一个接口,但是我们要选择他的实现类来使用,这里我们选择BCryptPasswordEncoder,这是官方推荐使用的密码加码器在这里插入图片描述
我们找到接口中的进行密码加密的方法encode方法,查看密码的加密规则
在这里插入图片描述
我们找个测试类来进行测试,看看加密方法的使用
在这里插入图片描述

 @Test
    void contextLoads() {
        //加密
        PasswordEncoder pwd = new BCryptPasswordEncoder();//官方推荐的测试方法
        String newPwd = pwd.encode("123456");//这个方法中自动加盐,为什么加盐,这样可以保证每次生成的密码不一样
        System.out.println("新加密的密码"+newPwd);
        //密码匹配
        boolean matches = pwd.matches("123456", newPwd);//用输入的密码跟加密后的密码比较
        System.out.println("密码匹配:"+matches);

    }

4.自定义登陆逻辑并编写配置类

在这里插入图片描述

/**
 * @author:swj
 * @describe: Security配置类
 * @date:2021/2/4 5:14 下午
 */
@Configuration
public class SecurityConfig {
    //自定义登陆逻辑的时候,容器里面一定要有PasswordEncoder的容器,不可以直接new,要把他放到容器中管理
    @Bean
    public PasswordEncoder getPwd() {
        return new BCryptPasswordEncoder();
    }

}

编写service,实现UserDetailsService
在这里插入图片描述

/**
 * @author:swj
 * @describe:
 * @date:2021/2/5 1:46 下午
 */
@Service
public class UserDetailsServiceImpl implements UserDetailsService {
   @Autowired
   private PasswordEncoder passwordEncoder;
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
      //先根据用户名去查询,如果用户名不存在就会抛出UsernameNotFoundException
        if(!username.equals("admin")){
           throw  new  UsernameNotFoundException("用户名不存在");
        }
        //假设数据的密码就是123,如果比较成功返回UserDetails(也就是返回实现类user)
        String pwd = passwordEncoder.encode("123");
        //返回的user中的构造中的参数分别是用户名,密码,权限列表等
        return new User(username,pwd,
                AuthorityUtils.commaSeparatedStringToAuthorityList("admin,normal"));
    }
}

启动项目测试一下,如何证明我们的自定义的权限生效呢?
在这里插入图片描述
启动的时候在控制台没有密码,我们在输入http://localhost:8080/login,跳转到登陆页面
当我们输入admin跟123的时候,测试
在这里插入图片描述
在这里插入图片描述
这样就证明我们自定义的逻辑已经生效了。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐