security - 如何在 Shiro 中更新经过身份验证的主体的主体

标签 security authentication jsf-2 shiro

我在 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/

相关文章:

jsf-2 - 浏览器后退按钮不会清除旧的支持 bean 值

linux - 限制 Linux 应用程序的系统调用访问

java - Glassfish 3 安全性 - 使用 JDBC 领域的基于表单的身份验证

安全模型 : log in to third-party site with user's credentials

web-services - 5位PIN码比大多数密码更好吗?

php - 当用户登录时显示 "logout"按钮,当他不使用 PHP/MySQL 时显示 'connect'

php - 要像这样添加 OpenID,我是否必须分别实现每个 OpenID

jsf-2 - 为什么复合组件的 “rendered”属性会引发IllegalArgumentException?

关于证书签名过程的java问题

jsf-2 - 如何从 Facelets 页面中的 JSP 页面获取请求参数?