gpt4 book ai didi

java - Apache 四郎 : authenticate with username/password but store user id as the principal

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:05:42 25 4
gpt4 key购买 nike

我开始使用 Apache Shiro。我从简单的示例开始,然后逐渐增加复杂性。

目前我正在使用 JSF 从登录表单中收集电子邮件地址和密码,并使用 UsernamePasswordToken 通过 Shiro 对用户进行身份验证。

UsernamePasswordToken token = new UsernamePasswordToken(email, password);
SecurityUtils.getSubject().login(token);

它由开箱即用的 JDBC 领域支持,带有一个简单的查询

jdbcRealm.authenticationQuery = SELECT password FROM user WHERE email = ?

为了获得有关用户的更多详细信息,例如他们的姓名,我通过委托(delegate)人在数据库中查找用户 - 这是他们的电子邮件地址。

currentUser = userDAO.findByEmail((String) SecurityUtils.getSubject().getPrincipal());

这很好用,但是允许用户更改他们的电子邮件地址,这会中断查找。我的目标是将唯一的用户 ID 存储为主体而不是电子邮件地址,因为这永远不会改变。我将如何实现这一目标?

最佳答案

我最终用一种简单的方法解决了这个问题——在创建身份验证 token 之前将电子邮件地址转换为用户 ID,并使用用户 ID 作为 token 中的主体。

try{
// Lookup the user by email
User user = userDAO.findByEmail(email);

// If no match we can't authenticate
if(user == null){
throw new AuthenticationException();
}

// Else, build a token with the user id and password
UsernamePasswordToken token = new UsernamePasswordToken(user.getUserId().toString(), password);

// Attempt to login
SecurityUtils.getSubject().login(token);

}catch(AuthenticationException ex){
return false;
}

我的 UserDAO bean 配置为处理 javax.persistence.NoResultException 并返回 null。

在我的 shiro.ini 文件中,我将 jdbcRealm.authenticationQuery 更改为以下内容(注意我使用的是 MySQL)

jdbcRealm.authenticationQuery = SELECT password FROM user WHERE user_id = CAST(? AS UNSIGNED)

最后,要查找有关我现在通过用户 ID 查找的用户的详细信息,它现在是主体。

currentUser = userDAO.findByUserId(Integer.parseInt((String) SecurityUtils.getSubject().getPrincipal()));

关于java - Apache 四郎 : authenticate with username/password but store user id as the principal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21966703/

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