目前的框架中
token是使用jwt生成,存储到redis控制token时效,而认证是使用UsernamePasswordAuthenticationToken实现的
微信小程序登录授权
需求分析
- 微信小程序登录是通过上传一个
code到后台,后台根据code调用微信端接口获取到openId和sessionKey(有些场景下不需要),返回token给小程序,小程序后面的请求带上token,后台要解析验证token - 小程序没有用户信息表,如果有,那和后台用的用户表也不是同一个表
解决方案
如果能通过openId和sessionKey伪造一个用户名密码,那代码改动起来会简单很多,只需要给一个类似SysUser的WxUser,LoginUser里可以多加一个WxUser属性,在SysLoginService扩展一个微信登录方法即可,而且登录方法内也只是做一个假的授权,并不去调用UserDetailsServiceImpl.loadUserByUsername,这样就很简单的实现统一管理token,验证token时候也没有问题
代码改造
新建WxUser类
在common模块下新建一个WxUser,和SysUser同级
package com.ruoyi.common.core.domain.entity;
import org.apache.commons.lang3.builder.ToStringBuilder;
import org.apache.commons.lang3.builder.ToStringStyle;
import com.ruoyi.common.core.domain.BaseEntity;
/**
* 微信用户实体
*
* @author Ricky
*/
public class WxUser extends BaseEntity
{
private static final long serialVersionUID = 1L;
/** 微信唯一标识 */
private String openId;
/** 微信会话秘钥 */
private String sessionKey;
public WxUser(String openId, String sessionKey)
{
super();
this.openId = openId;
this.sessionKey = sessionKey;
}
public String getOpenId()
{
return openId;
}
public void setOpenId(String openId)
{
this.openId = openId;
}
public String getSessionKey()
{
return sessionKey;
}
public void setSessionKey(String sessionKey)
{
this.sessionKey = sessionKey;
}
@Override
public String toString() {
return new ToStringBuilder(this,ToStringStyle.MULTI_LINE_STYLE)
.append("openId", getOpenId())
.append("sessionKey", getSessionKey())
.toString();
}
}
修改LoginUser类
LoginUser中加入WxUser属性,生成getter和setter,并且改写getPassword和getUsername 方法
package com.ruoyi.common.core.domain.model;
import java.util.Collection;
import java.util.Set;
import org.springframework.security.core.GrantedAuthority

最低0.47元/天 解锁文章
1952

被折叠的 条评论
为什么被折叠?



