1.用户第一次登录/绑定,通过微信的code拿到用户的openid,存到数据库里
2.用户第二次请求,发起一个微信自动登录请求,同样传入微信的code,后台检验获取openid,检验该openid是否已经存在数据库,如果有就可以自动登录.
3.实现一个自己的MyRealm和MyOpenIdToken,主要为了能够Subject存入openid方便检验

//通过获取到自动登录的openIdString openid = apiResult.get("openid");Subject subject = SecurityUtils.getSubject();//使用自定义realm验证openid是否已绑定用户WxOpenIdToken wxOpenIdToken =new WxOpenIdToken(openid);subject.login(wxOpenIdToken);`
  `MyOpenIdToken`:类似实体类,需要继承`UsernamePasswordToken``MyRealm`:继承`AuthorizingRealm` 真正的验证逻辑在这里处理,

注意 :多个realm需要在shiro配置中配置使用策略,也可以自行百度

 缺点:因为subject中存的是openId所以登录之后还需要额外的去获取用户信息

贴一下我的代码

MyOpenIdToken.java

//MyOpenIdTokenpublic class WxOpenIdToken extends UsernamePasswordToken implements Serializable {private String openId;/****/private static final long serialVersionUID = 4812793519945855483L;@Overridepublic Object getPrincipal() {return getOpenId();}@Overridepublic Object getCredentials() {return "ok";}public WxOpenIdToken(String openId){this.openId=openId;}}

WxOpenIdRealm.java

public class WxOpenIdRealm extends AuthorizingRealm {@Resourceprivate SysUserDao sysUserDao;@Resourceprivate SysMenuDao sysMenuDao;/*** 授权* @param principals* @return*/@Overrideprotected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {//TODO 用户权限列表,普通信息等...return info;}/*** 鉴权   openid 判断是否用户是否已经绑定微信* @param token* @return* @throws AuthenticationException*/@Overrideprotected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken token) throws AuthenticationException {String openid = (String) token.getPrincipal();//sysUserDao.getbyWxaOpenId 根据openid查询是否有已绑定的userid,有就时已绑定SysUserEntity exUser = sysUserDao.getbyWxaOpenId(openid);if (exUser != null) {AuthenticationInfo authcInfo = new SimpleAuthenticationInfo(openid, "ok", this.getClass().getSimpleName());return authcInfo;} else {return null;}}}

ShiroConfig.java 注入两个realm并设置验证策略

@Bean
public UserRealm userRealm(){UserRealm userRealm = new UserRealm();//账号密码登录使用realmreturn userRealm;
}@Bean
public WxOpenIdRealm wxCodeRealm(){WxOpenIdRealm wxOpenIdRealm = new WxOpenIdRealm();//小程序使用openid登录使用的realmreturn wxOpenIdRealm;
}/*** 系统自带的Realm管理,主要针对多realm* */@Beanpublic ModularRealmAuthenticator modularRealmAuthenticator() {ModularRealmAuthenticator modularRealmAuthenticator = new ModularRealmAuthenticator();//只要有一个成功就视为登录成功modularRealmAuthenticator.setAuthenticationStrategy(new AtLeastOneSuccessfulStrategy());return modularRealmAuthenticator;}

不只是微信小程序,同样的还有app登录,手机短信验证码都可以自定义realm验证



由于本人第一次使用微信小程序配合 Shiro 做验权,
发现小程序不能像普通网页那样做验权,
后台 Shiro 根本识别不到小程序客户端的状态

原因
原来是小程序不自带 cookie 的管理,导致 Shiro 下发的 SessionId,
再小程序下次请求时,不会带上之前的 SessionId
解决方案
自己手动存储 cookie ,并在所有请求中带上 cookie
这是最简单粗暴的方法之一
(当然,也可以去自定义 Shiro 的 Session 管理,等等其他方法)

第一次登录请求时,保存 cookie

http(post, "/api/wx/login", {code,
}).then((response) => {wx.setStorageSync("sessionId", response.header["Set-Cookie"]);wx.navigateBack();
});

之后发送请求时,都带上 cookie

const http = (method, url, data) => {let header;// 将存储的 cookie 带上if (wx.getStorageSync("sessionId")) {header = {"content-type": "application/x-www-form-urlencoded",cookie: wx.getStorageSync("sessionId"),};}return new Promise((resolve, reject) => {wx.request({data,method,url: `${host}${url}`,header,dataType: "JSON",success: (response) => {let statusCode = response.statusCode;},fail: (errors) => {wx.showToast({ title: "请求失败", icon: "none" });reject(errors);},});});
};

使用 Shiro 配合微信小程序或者app登录,做验权相关推荐

  1. H5页面内嵌到微信小程序和APP,做分享操作

    前言 最近接到项目新需求,H5项目需要内嵌到微信小程序和APP里,然后将H5页面分享出去,被分享的人可以点击消息跳转到H5页面.H5页面不难,难的是要与微信小程序和APP进行交互,因为以前也没有接触过 ...

  2. Android APP跳转微信小程序和APP跳转支付宝小程序传参

    Android APP跳转微信小程序和APP跳转支付宝小程序传参 微信开放文档链接 MINIPROGRAM_TYPE_PREVIEW:体验版. MINIPROGRAM_TYPE_TEST:开发版 MI ...

  3. 二手市场回收基于微信小程序和app两种应用开发uniapp

    回收纸皮书籍.服装饰品.箱包鞋帽.床上用品.塑料制品.其他 ,微信小程序.app开发 源码下载地址:请点击下载

  4. Java后端对接微信支付(微信小程序、APP、PC端扫码)非常全,包含查单、退款

    首先我们要明确目标,我们点击 微信支付官网 ,我们主要聚焦于这三种支付方式,其中JSPAI与APP主要与uniapp开发微信小程序与APP对接,而NATIVE主要与网页端扫码支付对接 1.三种支付统一 ...

  5. 微信小程序、app集成微信支付

    一.微信小程序支付 开发文档:https://pay.weixin.qq.com/wiki/doc/api/wxa/wxa_api.php?chapter=7_11&index=2 申请小程序 ...

  6. 微信小程序--在app.js 和其他页面中更改globalData的值

    微信小程序--在app.js 和其他页面中更改globalData的值 app.js中修改 其他页面 app.js中修改 在app.js中,应当在小程序初始化完成以后再更改全局变量的值,即在onLau ...

  7. uniapp的打包:h5、微信小程序以及APP方式

    uniapp的打包:h5.微信小程序以及APP方式 H5打包 微信小程序打包 App打包 本人用的是HBuilder编译器,学习uniapp时b站某位大大推荐的,我刚开始接触代码时候也用过,那时候并不 ...

  8. 基于uniapp+vue+微信小程序+安卓app电影院订票小程序H5网站设计

    开发技术:uniapp + vue + ElementUI + 微信小程序 + 安卓app + Springboot 开发工具环境:HBuilder + 微信开发者工具 + VsCode + Idea ...

  9. 微信小程序/网页/app/android等各种bar图标导航图标文章图标标题图标下拉/检索收藏上传客服等图标整理

    在做微信小程序的时候,需要给底部放置图标.但是找了好久都没有找到自己想要的,适合的.后来我就把所有的小程序的图标都看了下.后来想想还是整理出来,方便自己以后用,也方便大家一下.我敢保证有你想要的,适合 ...

  10. uni-app 微信小程序 模仿 app二层楼功能

    uni-app 微信小程序 模仿 app二层楼功能 先占个坑,今天应该写不完, 后续在慢慢补全 更新 终于写完了 这个的计算量很大,我自己的安卓机测试的时候一卡一卡的,公司同事的iphone是没有问题 ...

最新文章

  1. 从高耦合到低耦合到底有多远?
  2. Android真机运行错误INSTALL_FAILED_MEDIA_UNAVAILABLE
  3. Confluence 6 从外部目录中同步数据支持的目录类型
  4. ip找计算机名 linux,如何从IP地址中查找LAN中的计算机名称?
  5. (转)Clang 比 GCC 编译器好在哪里?
  6. 最耗性能的SQL语句
  7. eclipse快捷键大全---分操作归纳
  8. Telnet FTP Xwindow
  9. 黑客帝国canvas黑客帝国代码雨特效-A5源码
  10. sony电视投屏android,Wow,将苹果Macbook投屏到索尼BRAVIA原来是这样玩…教程分享
  11. 北京航空航天大学夏令营机试题
  12. linux 命令:less详解
  13. Python数据分析-绘图-3-Bokeh交互式绘图-1-基本构成与语法
  14. keil调试过程中源代码界面没有箭头
  15. qbo_arduqob command 命令Id约定
  16. 短视频剪辑教程自学难吗?子苗教育
  17. java 获取kafka lag,聊聊kafka consumer offset lag的监控
  18. CSDN专家博客手机客户端分享使用
  19. 翻译:(MPN-Cov)Is Second-order Information Helpful for Large-scale Visual Recognition?
  20. [Android开发那点破事]解决android.os.NetworkOnMainThreadException

热门文章

  1. 【论文笔记】Learning Convolutional Networks for Content-weighted Image Compression
  2. Vue / axios / props 调用后端接口数据并渲染到页面
  3. 计算机课堂活跃小游戏,几个课堂小游戏(能活跃课堂气氛)
  4. 世界互联网大会上有哪些黑客科技值得关注?
  5. 外卖点餐管理系统源码
  6. mumax3 linux安装教程
  7. 微信开发、申请微信号测试账号
  8. mac上好用的数据统计分析工具spss26
  9. 三菱Q系列通过wifi联服务器,三菱Q系列PLC以太网通讯,三步可以搞定!
  10. 计算机代表的数字,计算机中数的表示