我在 JSF2 项目中使用 Shiro 1.2.3。我找不到一种无需注销即可更新经过身份验证的主体的方法。当登录用户想要更新他/她的个人资料信息时,我需要这个。我存了一个 userBean
作为主体,它应该与配置文件信息一起更新。以编程方式登录可能是一种解决方案,但这次需要用户的密码来创建 token 。
最佳答案
一段时间过去了,但我希望这对其他人也有用。
当您使用 Shiro 登录时,会创建一个 session ,并向客户端发送 token 以供进一步请求。
对于每个请求,Shiro 拦截 HTTP 请求,验证 token 是否有效,然后使用 创建一个新的主题。 org.apache.shiro.web.mgt.DefaultWebSubjectFactory.createSubject(SubjectContext 上下文) 包含重要行的方法
PrincipalCollection principals = wsc.resolvePrincipals();
最终将我们带到解决方法 org.apache.shiro.subject.support.DefaultSubjectContext.resolvePrincipals() 其中包含关键行
Session session = resolveSession();
if (session != null) {
principals = (PrincipalCollection) session.getAttribute(PRINCIPALS_SESSION_KEY);
}
也就是说,要在不注销的情况下更新主题的主体,您需要更新他/她的 session 的 PRINCIPALS_SESSION_KEY 属性。总结你的代码可以很简单
PrincipalCollection pc = (PrincipalCollection) getSubject().getSession().getAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY;
// do something in here
getSubject().getSession().setAttribute(DefaultSubjectContext.PRINCIPALS_SESSION_KEY, pc);
关于security - 如何在 Shiro 中更新经过身份验证的主体的主体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31702084/