springcloud集成Oauth2权限项目-oauth调用user服务获取数据库用户信息(八)

 

上一篇《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中

项目地址:https://github.com/James-Pan0525/vcloud.git

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在Spring Security OAuth2 Authorization Server 0.3.1中,可以通过实现TokenEnhancer接口来向Access Token中添加用户信息。具体步骤如下: 1. 创建一个类,实现TokenEnhancer接口,例如: ```java public class CustomTokenEnhancer implements TokenEnhancer { @Override public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) { Map<String, Object> additionalInfo = new HashMap<>(); additionalInfo.put("user_name", authentication.getName()); ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo); return accessToken; } } ``` 上述代码中,我们向Access Token的附加信息中添加了一个名为"user_name"的键值对,它的值为当前用户用户名。 2. 在Authorization Server配置类中,设置TokenEnhancer,例如: ```java @Configuration @EnableAuthorizationServer public class AuthorizationServerConfig extends AuthorizationServerConfigurerAdapter { @Autowired private AuthenticationManager authenticationManager; @Autowired private UserDetailsService userDetailsService; @Autowired private DataSource dataSource; @Override public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { endpoints.authenticationManager(authenticationManager) .userDetailsService(userDetailsService) .tokenStore(tokenStore()) .tokenEnhancer(tokenEnhancer()); } @Bean public TokenEnhancer tokenEnhancer() { return new CustomTokenEnhancer(); } // ... } ``` 在上述代码中,我们通过调用tokenEnhancer()方法来设置TokenEnhancer,它使用我们自定义的CustomTokenEnhancer类。 3. 在调用/token接口时,通过获取Access Token的响应内容,可以看到"user_name"键值对的值已经被添加到Access Token的附加信息中。 以上就是向Access Token中添加用户信息的步骤。需要注意的是,如果要添加更多的用户信息,只需要在CustomTokenEnhancer类的enhance()方法中继续向additionalInfo中添加键值对即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值