shiro 框架中SecurityUtils.getSubject().getPrincipal()

SecurityUtils.getSubject().getPrincipal(); shiro 框架中这个在首次登陆为null,不知道从呢里去排除代码
 protected XtyhxxbEntity getUser() {
        XtyhxxbEntity entity = (XtyhxxbEntity) SecurityUtils.getSubject().getPrincipal();
        if (entity != null && StringUtils.isEmpty(entity.getJsmc())) {
            try {
                entity.setJsmc(sysDepartmentService.getDepartment(entity.getJsbh()));
            } catch (Exception e) {
                entity.setJsmc(" ");
            }
        }
        // 登陆人不是系统管理员并且民警编号不为空的情况下查询数据
        if (!Constant.SUPER_ADMIN.equals(entity.getYhbh()) && StrUtil.isNotBlank(entity.getMjbh())) {
            MjMjxxbEntity mjInfo = mjMjxxbService.getById(entity.getMjbh());
            entity.setMjgwid(mjInfo.getMjgwdm());
            entity.setMjgwmc(mjInfo.getMjgwmc());
        }
        return entity;
    }

 

realm认证写的有问题。可参考 https://blog.csdn.net/weixin_42672204/article/details/104182859?utm_source=app&app_version=4.7.1

您好,我是有问必答小助手,您的问题已经有小伙伴解答了,您看下是否解决,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632

采用装饰类的思路解决
由于 Controller 层中 subject.login(authenticationToken); 登录的时候传递给Shiro的类是UsernamePasswordToken 类,该类对象会原封不动作为 token 传递到 doGetAuthenticationInfo 方法里。既然如此就可以将 UsernamePasswordToken 类进行装饰,然后给它加一个新的成员变量传递我想传递的信息,这样在 doGetAuthenticationInfo 方法中就可以获取到了。
装饰类源码如下:

package com.wu.demoblog.decorate;

import lombok.Data;
import org.apache.shiro.authc.UsernamePasswordToken;

/**
 * UsernamePasswordToken 的装饰类,为它添加一些东西后再使用
 * @Author :吴用
 * @Date :2020-08-14 22:19
 * @Version :1.0
 */
@Data
public class UsernamePasswordTokenChild extends UsernamePasswordToken {
    private Object msg; //这里是新加的成员变量
	// 注意构造方法是不继承的,所以需要自己写一下,用 idea 可以快速构建下面这些构造方法
    public UsernamePasswordTokenChild() {
        super();
    }

    public UsernamePasswordTokenChild(String username, char[] password) {
        super(username, password);
    }

    public UsernamePasswordTokenChild(String username, String password) {
        super(username, password);
    }

    public UsernamePasswordTokenChild(String username, char[] password, String host) {
        super(username, password, host);
    }

    public UsernamePasswordTokenChild(String username, String password, String host) {
        super(username, password, host);
    }

    public UsernamePasswordTokenChild(String username, char[] password, boolean rememberMe) {
        super(username, password, rememberMe);
    }

    public UsernamePasswordTokenChild(String username, String password, boolean rememberMe) {
        super(username, password, rememberMe);
    }

    public UsernamePasswordTokenChild(String username, char[] password, boolean rememberMe, String host) {
        super(username, password, rememberMe, host);
    }

    public UsernamePasswordTokenChild(String username, String password, boolean rememberMe, String host) {
        super(username, password, rememberMe, host);
    }
}

在 Controller 层使用该对象,把自己想要的信息放进该对象中,在 Realm 中将 token 强转成该类对象,然后就可以通过 getMsg() 方法提取出来自己在Controller层放入的内容了。