更新时间:2023-03-30 来源:黑马程序员 浏览量:
在认证阶段DaoAuthenticationProvider会调用UserDetailService查询用户的信息,这里是可以获取到齐全的用户信息的。由于JWT令牌中用户身份信息来源于UserDetails,UserDetails中仅定义了username为用户的身份信息,这里有两个思路:第一是可以扩展UserDetails,使之包括更多的自定义属性,第二也可以扩展username的内容 ,比如存入json数据内容作为username的内容。相比较而言,方案二比较简单还不用破坏UserDetails的结构,我们采用方案二。
修改UserServiceImpl如下:
package com.xuecheng.ucenter.service.impl; import com.alibaba.fastjson.JSON; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.xuecheng.ucenter.mapper.XcUserMapper; import com.xuecheng.ucenter.model.po.XcUser; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.userdetails.User; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UserDetailsService; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.stereotype.Service; /** * @author Mr.M * @version 1.0 * @description TODO * @date 2022/9/28 18:09 */ @Service public class UserServiceImpl implements UserDetailsService { @Autowired XcUserMapper xcUserMapper; /** * @description 根据账号查询用户信息 * @param s 账号 * @return org.springframework.security.core.userdetails.UserDetails * @author Mr.M * @date 2022/9/28 18:30 */ @Override public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { XcUser user = xcUserMapper.selectOne(new LambdaQueryWrapper<XcUser>().eq(XcUser::getUsername, s)); if(user==null){ //返回空表示用户不存在 return null; } //取出数据库存储的正确密码 String password =user.getPassword(); //用户权限,如果不加报Cannot pass a null GrantedAuthority collection String[] authorities = {"p1"}; //为了安全在令牌中不放密码 user.setPassword(null); //将user对象转json String userString = JSON.toJSONString(user); //创建UserDetails对象 UserDetails userDetails = User.withUsername(userString).password(password).authorities(authorities).build(); return userDetails; } }
重启认证服务,重新生成令牌,生成成功。我们可以使用check_token查询jwt的内容。
###校验jwt令牌 POST {{auth_host}}/oauth/check_token?token=
响应示例如下,
{ "aud": [ "res1" ], "user_name": "{\"birthday\":\"2022-09-28T19:28:46\",\"createTime\":\"2022-09-28T08:32:03\",\"id\":\"50\",\"name\":\"学生1\",\"nickname\":\"大水牛\",\"password\":\"$2a$10$0pt7WlfTbnPDTcWtp/.2Mu5CTXvohnNQhR628qq4RoKSc0dGAdEgm\",\"sex\":\"1\",\"status\":\"1\",\"username\":\"stu1\",\"userpic\":\"http://file.51xuecheng.cn/dddf\",\"utype\":\"101001\"}", "scope": [ "all" ], "active": true, "exp": 1664372184, "authorities": [ "p1" ], "jti": "73da9f7b-bd8c-45ac-9add-46b711d11fb8", "client_id": "c1" }
user_name存储了用户信息的json格式,在资源服务中就可以取出该json格式的内容转为用户对象去使用。