上一篇《springcloud集成Oauth2权限项目-oauth服务使用jwt获取access_token(password模式)(七)》获取用户是在oauth服务写死用户名和密码,现在要改造,oauth调用user服务去获取用户信息。
改造......
首先在oauth和user创建关于用户信息的实体bean,取名UserVo
在user服务中添加获取用户信息的接口
@GetMapping("/getUserByUsername/{username}")
public UserVo getUserByUsername(@PathVariable String username){
EntityWrapper<SysUser> sysUserEntityWrapper = new EntityWrapper<>();
sysUserEntityWrapper.eq("username",username);
SysUser sysUser = sysUserService.selectOne(sysUserEntityWrapper);
if(sysUser==null){
return null;
}
UserVo userVo = new UserVo(sysUser.getUserId().longValue(),sysUser.getUsername(),sysUser.getPassword());
return userVo;
}
这个接口传入username,然后根据用户名查找用户。并返回userVo实体对象。user服务改造完成
现在改造oauth服务
添加相应的实体userVo,用于接收user服务返回的实体信息
下一步,利用feign调用user服务
创建UserService接口类
其中fallback是容错处理。在网络请求时,可能会出现异常请求,如果还想再异常情况下使系统可用,那么就需要容错处理。
当调用user服务不可用时,则会进入容错处理,我这里容错类是UserServiceImpl
当user服务不可用时会返回空。
改造核心的类UserDetailsServiceImpl
@Component("userDetailsService")
public class UserDetailsServiceImpl implements UserDetailsService {
@Autowired
private UserService userService;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
UserVo userVo = userService.getUserByUsername(username);
if (userVo==null) {
throw new UsernameNotFoundException("用户不存在或密码错误");
}
UserVoDetail userVoDetail = new UserVoDetail();
userVoDetail.setUserId(userVo.getUserId());
userVoDetail.setUsername(userVo.getUsername());
userVoDetail.setPassword(userVo.getPassword());
return userVoDetail;
}
}
上面这段就是调用user服务获取用户信息接口,然后组装参数,oauth会自动匹配你输入的密码和数据库密码比对,具体怎么认证就只有看源码了《Spring Security Oauth2 认证流程(password模式)》
改造完成。测试:
依次启动项目:eureka----->user------>oauth----->zuul服务
数据库中有一个用户
POST访问网关:127.0.0.1:9999/oauth/oauth/token?username=hello&password=hello&grant_type=password&scope=scope&client_id=client_id&client_secret=client_secret
获取成功
我们把用户名少输一个o,会把用户名和密码错误
改造完成,至于统一格式以后再完善。下一篇准备些把token存入redis中