之前我们将用户名密码写在了配置文件里面,真正开发的时候,用户名密码是在数据库中的。还有就是在点击登录之后,验证用户名和密码是不是正确,这个是框架自己验证的,我们都不知道人家咋认证的,我们需要做的就是一个配置,我们当初做的就是,前端这样写


配置文件这样写



这样这个路径login ,我们只要配置了这个login路径,那么就可以自动的验证。底层验证,我们不知道。

问题

现在我们将用户名密码保存在数据库,而不是配置文件中,这个咋验证

分析人家的验证代码

过滤器里面进行验证的
过滤器在这个地方

找和验证相关的过滤器

进入看源码,看人家是咋验证的


通过源码我们可以看到,这个前端传过来的用户名密码的name已经确定了,人家框架规定了,以后如果要使用框架的认证规则,前端的name的名字必须是这个username password
前端登录走的路径必须是login 传的状态必须是post

这个是人家源码里面的东西。我们要使用人家的认证,就必须要符合人家的规则

以上的过滤器将前端的用户名密码拿到,就可以进行验证,人家的验证是一个方法,就是这个方法


我们进入这个方法

看到这个方法是在接口里面的方法


按 Ctrl+H 查看这个接口的实现类,有好多的实现类


既然这个接口有好多的实现类,我们就找和验证相关的实现类


进入这个实现类,找到对应的方法,就是这个验证的方法


一直进源码,可以看到

也就是人家的验证是实现了这个接口,这个接口里面的返回值是UserDetails 这个对象

UserDetails这个对象就是人家源码里面,将前端传过来的用户名和密码进行了封装,封装为这个对象,这个是人家源码里面的。

自己定义认证规则

既然人家源码里面,验证规则是这个实现了一个接口,并且接口的返回值是固定的,那么自己定义的时候,也是要自己实现这个接口,返回的东西是人家规定的UserDetails 这个对象

1 让自己的和用户相关的接口继承人家源码的必须的接口

自己的接口继承了人家规定的,那么自己的接口就符合人家框架的要求了
在自己的接口,要有一个实现类,类里面继承我们的接口,重写里面的方法,现在要还要重写源码接口里面的方法

重写了源码里面的方法,有一个参数,用户名的参数,这个就是接收前端的用户名。那么我们就可以在这个方法里面接收到前段的用户名,用这个用户名在数据库里面查有没有这个用户,查出来之后,将查出来的用户封装为人家源码要返回的对象,就是这个对象UserDetails 这个对象,具体的操作如下

UserDetails 是一个接口,有自己的实现类user

 UserDetails userDetails = new User(sysUser.getUsername(), sysUser.getPassword(), authorities);

这个User对象有三个参数,第一个是用户名,第二个是查出来的密码,第三个是认证通过之后的用户的全部的权限,也就是第三个参数就是一个集合

    List<SimpleGrantedAuthority> authorities = new ArrayList<>();
            List<SysRole> roles = sysUser.getRoles();
            for (SysRole role : roles) {
   
                authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
            }

以上就是封装了这个权限的集合

全部的认证的业务代码如下:

    /** * 认证业务 * @param username 用户在浏览器输入的用户名 * @return UserDetails 是springsecurity自己的用户对象 * @throws UsernameNotFoundException */
    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
   
        try {
   
            //根据用户名做查询
            SysUser sysUser = userDao.findByName(username);
            if(sysUser==null){
   
                return null;
            }
            List<SimpleGrantedAuthority> authorities = new ArrayList<>();
            List<SysRole> roles = sysUser.getRoles();
            for (SysRole role : roles) {
   
                authorities.add(new SimpleGrantedAuthority(role.getRoleName()));
            }
            //{noop}后面的密码,springsecurity会认为是原文。
            UserDetails userDetails = new User(sysUser.getUsername(), sysUser.getPassword(), authorities);
            return userDetails;
        }catch (Exception e){
   
            e.printStackTrace();
            //认证失败!
            return null;
        }

    }

现在还要改springsecurity的数据源,之前我们在配置文件里面写死了,现在要改为数据源为数据库


写成以上的这个,意思就是用户名和密码要从这个业务的接口拿,意思就是以后我们写的用户名和密码要从数据库里面进行验证,不是内存里面了。

以上就是认证的全部

此时,我们要看认证的权限


这个在配置文件里面写死了,意思是除了登录的页面,其他的路径要通过,要有这个权限,不然报错

以上就可以了,现在重新启动之后,就可以使用了,记住,现在数据库里面的密码是加密之后的


以上的流程是直接使用了这个加密,关于这个springsecurity框架的加密,我们下一次讲