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