gpt4 book ai didi

security - session 固定 - 登录后删除 session 并创建新 session - 但用户不再登录

转载 作者:行者123 更新时间:2023-12-02 19:22:00 24 4
gpt4 key购买 nike

我在 JBoss AS 7 上使用 jsf2.0 和 java ee6

我有一个 LoginController.java 看起来像这样:

@ManagedBean(name = "loginController")
@SessionScoped
public class LoginController implements Serializable{

private static final long serialVersionUID = 1119172305268193508L;

@Inject
private UserProvider userProvider;

@PostConstruct
public void initNewUser() {
user = new User();
}

private User user;

private String accountName;

private String password;

public String ownLogin() throws Exception {

HttpServletRequest request = (HttpServletRequest) FacesContext.getCurrentInstance()
.getExternalContext().getRequest();


if (accountName != null) {
try {


if (exists(accountName)) {

user = userProvider.findUserByAccountName(accountName);

if (verifyPassword(user, password)) {

userProvider.saveChangedUser(user);


// OWASP SAYS: after login, destroy the session make a new one
// a so called handover
// Destroy the session
FacesContext facesContext = FacesContext.getCurrentInstance();

HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
if(session != null){
session.invalidate();
}
// create new session after logout
session = (HttpSession) facesContext.getExternalContext().getSession(true);
setLogin(true);
}
}

/* some getters and setters */

}

OWASP 表示,出于安全原因,登录后应删除 session (请参阅: V3.7 )

此时我在代码中执行此操作:

FacesContext facesContext = FacesContext.getCurrentInstance();

HttpSession session = (HttpSession) facesContext.getExternalContext().getSession(false);
if(session != null){
session.invalidate();
}
// create new session after logout
session = (HttpSession) facesContext.getExternalContext().getSession(true);

首先,我删除旧 session ,然后创建一个新 session 。
之后,我将登录设置为 true...

当然,在运行整个代码后,用户没有登录,因为 LoginController 是在旧 session 范围内管理的 - 而在新 session 范围中,该范围内有一个新的 LoginController,而没有登录用户...

有什么方法可以在创建后将新的 LoginController 添加到新 session 中吗?

或者常见的方法是什么?

最佳答案

当您使 session 无效时,其所有属性都将在响应结束时被丢弃。但是,您要在仅存在于旧 session 中的 session 范围 bean 实例上设置登录状态。

您基本上需要手动重新创建 session 作用域 bean 并将其放入新 session 中无效之后。

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.invalidateSession();
LoginController loginController = new LoginController();
loginController.setUser(user);
externalContext.getSessionMap().put("loginController", loginController);

(看吧,不再有丑陋的 javax.servlet 导入了!)

顺便说一句,当您这样做时,您也可以将您的 LoginController 设为 View 作用域 bean,并仅在 session 中处理 User

ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext();
externalContext.invalidateSession();
externalContext.getSessionMap().put("user", user);

(#{user} 在整个 EL 上下文中以及托管属性中都可以使用它;它不一定需要是 JSF 托管 bean)

关于security - session 固定 - 登录后删除 session 并创建新 session - 但用户不再登录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9830049/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com