AppletShiroRealm
没有被触发的主要原因是:
Shiro配置问题: 在 ShiroConfig.java
中,shiroFilter
方法使用的是 SecurityManager
参数,但这个参数绑定的是 securityManager
Bean,而不是 appletSecurityManager
。
过滤器配置问题: 虽然配置了 AppletJwtFilter
,但它没有正确关联到 AppletShiroRealm
。
用户服务接口问题: IAppletUserService
的包路径发生了变化,导致依赖注入失败。
// 原来的配置
@Bean("shiroFilterFactoryBean")
public ShiroFilterFactoryBean shiroFilter(SecurityManager securityManager) {
// 这里使用的是 securityManager,而不是 appletSecurityManager
}
// 小程序请求应该使用 appletApi 过滤器
filterChainDefinitionMap.put("/appletApi/**", "appletApi");
// 原来的包路径
import org.jeecg.modules.appletBackground.appletUser.service.IAppletUserService;
// 修改后的包路径
import org.jeecg.common.api.IAppletUserService;
shiroFilter
方法中添加小程序登录接口的匿名访问配置// 小程序登录相关接口不需要认证
filterChainDefinitionMap.put("/appletApi/login/wxLogin", "anon");
filterChainDefinitionMap.put("/appletApi/login/getPhoneNumber", "anon");
// applet专用过滤器,只处理/applet开头的请求
filterChainDefinitionMap.put("/appletApi/**", "appletApi");
// 检查是否是登录相关接口,这些接口不需要认证
if (requestPath.startsWith("/appletApi/login/wxLogin") ||
requestPath.startsWith("/appletApi/login/getPhoneNumber")) {
return true;
}
package org.jeecg.common.api;
public interface IAppletUserService {
AppletUser getByOpenid(String openid);
AppletUser getByPhone(String phone);
boolean save(AppletUser user);
boolean updateById(AppletUser user);
}
@Service
public class AppletUserServiceImpl extends ServiceImpl<AppletUserMapper, AppletUser>
implements IAppletUserService {
// 实现具体方法
}
private AppletUser getAppletUser(String openid) {
try {
// 从数据库查询用户信息
AppletUser appletUser = appletUserService.getByOpenid(openid);
if (appletUser != null) {
log.debug("从数据库获取到小程序用户: {}", appletUser.getName());
return appletUser;
}
log.warn("未找到小程序用户,openid: {}", openid);
return null;
} catch (Exception e) {
log.error("获取小程序用户信息异常,openid: {}", openid, e);
return null;
}
}
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
// 小程序用户默认权限
info.addRole("applet_user");
info.addStringPermission("applet:user:*");
return info;
}
public Result<String> bindPhoneNumber(String phoneCode) {
try {
// 获取当前登录用户
AppletUser currentUser = AppletUserUtil.getCurrentAppletUser();
if (currentUser == null) {
return Result.error("用户未登录");
}
// 其他逻辑...
} catch (Exception e) {
log.error("绑定手机号异常", e);
return Result.error("绑定失败: " + e.getMessage());
}
}
@GetMapping("/getUserInfo")
public Result<AppletUser> getUserInfo() {
log.info("收到获取用户信息请求");
return appletApiLoginService.getUserInfo();
}
@RestController
@RequestMapping("/appletApi/test")
public class AppletTestController {
@GetMapping("/getCurrentUser")
public Result<AppletUser> getCurrentUser() {
AppletUser currentUser = AppletUserUtil.getCurrentAppletUser();
if (currentUser == null) {
return Result.error("用户未登录");
}
return Result.OK("获取成功", currentUser);
}
}
AppletShiroRealm
的调试信息修复后,当访问 /appletApi/**
路径的请求时:
IAppletUserService
的实现类被正确注册为Spring Beanapplet_user
表存在且有数据AppletShiroRealm
的日志级别设置为DEBUG,便于调试AppletShiroRealm
的关键方法中添加日志