我正在尝试使用Shiro对我正在构建的JSF Web应用程序进行身份验证和授权。不幸的是,我仍然有一些困难缠绕我的头如何把所有的东西放在一起。
我已经成功地(100%使用shiro.ini文件)将身份验证配置回存储测试凭据集的JDBC领域。当凭据以明文形式存储时,它对我来说非常有效。
我的最终目标是统一MySQL数据库中的现有凭证集。密码存储为SHA-256盐哈希。我花了一整天的时间阅读可用的文档(不包括Javadocs),但我仍然难以理解如何准确地设置它。
为了分阶段实现,我修改了我的shiro。ini如下所示,旨在简单使用SHA-256哈希:
[main]
dataSource = org.apache.shiro.jndi.JndiObjectFactory
dataSource.resourceName = jdbc/Communicator_dev
jdbcRealm = org.apache.shiro.realm.jdbc.JdbcRealm
jdbcRealm.dataSource = $dataSource
dataSource.resourceRef = true;
jdbcRealm.authenticationQuery = select password from account where site_id = ?
jdbcRealm.userRolesQuery = select user_role from web_roles where site_id = ?
# From https://stackoverflow.com/questions/20742666/shiro-with-jdbc-and-hashed-passwords.
#
passwordService = org.apache.shiro.authc.credential.DefaultPasswordService
#configure the passwordService to use the settings you desire
#...
passwordMatcher = org.apache.shiro.authc.credential.PasswordMatcher
passwordMatcher.passwordService = $passwordService
#...
# Finally, set the matcher on a realm that requires password matching for account authentication:
jdbcRealm.credentialsMatcher = $passwordMatcher
实际的登录逻辑是在页面支持bean中编程的。下面是我目前使用的简单测试源:
// Create auth token
UsernamePasswordToken token = new UsernamePasswordToken(this.siteID, this.password);
// Get the current subject
Subject currentUser = SecurityUtils.getSubject();
// Attempt to login
try {
currentUser.login(token);
} catch (AuthenticationException e) {
System.out.println("Invalid creds.");
return "";
}
return "authenticated.xhtml?faces-redirect=true";
这段代码与存储在我的RDBMS中的明文密码完美配合,但是现在我已经对它们进行了散列,它失败了。
根据我对框架的理解,我认为问题出在身份验证令牌上。我知道我需要使用不同的令牌来最终实现存储在我的RDBMS中的盐渍哈希,但是我对如何继续感到困惑。
我不想重新发明轮子。四郎有什么东西能做到这一点吗?我已经检查了Les到PasswordMatcher和PasswordService的链接(从jdbc和散列密码的链接shiro),但这仍然不清楚。我需要子类PasswordMatcher吗?
(2) 架构问题:谁真正调用doCredentialsMatch(…)方法它是登录执行期间的域吗(…)方法
(3) doCredentialsMap(…)的AuthenticationInfo参数方法那是由王国提供的吗?由于领域封装了实际的安全数据,在我的例子中,这是从从从RDBMS返回密码的SQL查询创建的对象吗?
非常感谢您抽出时间!我希望当我对这一切都了如指掌时,我能为文档做出贡献。
第1项:我怀疑您可能遇到了这个问题,涉及JdbcRealm的“salt style”参数,该参数默认为“NO_salt”。这会导致散列工作,但如果您在密码中添加了salt,则域将无法正确匹配它们。
以下是您的后续步骤:
基于列的salt样式的默认查询如下:“从username=?”的用户中选择password,password\u salt”。如果无法使用该结构,则需要通过“shiro”提供新的查询。ini’具有类似的结构。
jdbcRealm.authenticationQuery=select password, salt_column_here from users where username = ?
这里有一个相关的问题。
第2项:是的,领域调用doCredentialsMatch(..)方法
项目3:是的,域向doCreentialsMatch(...)方法提供了身份验证信息。
我正在使用生成用户密码的强哈希值。我想登录用户,但不想通过网络以明文形式发送密码,如何检查密码是否正确(没有往返),因为它是加盐的? 我有一个客户端/服务器场景。客户端是台式计算机上的应用程序(不是网站,也不是超文本传输协议服务器)。 我怎样才能做到这一点?我只是走了这么远:我正在客户端上生成salt散列,从中形成一个mcf并将其发送到我的服务器。将mcf保存到数据库。我没有发送密码,只发送了实际
我试图建立一个认证系统与Laravel 4与Facebook登录。我正在使用Laravel 4的madewith love/laravel-oAuth2包。 当然,当用户登录Facebook时,没有密码可以添加到我的数据库中。但是,我正在尝试检查数据库中是否已经有用户id,以确定是否应该创建一个新实体,或者只是登录当前实体。我想使用Auth命令来实现这一点。我有一张叫做“粉丝”的桌子。 这就是我正
创建密钥对并通过ssh-copy-id将公钥发送到服务器后,我仍然无法在没有密码的情况下登录 ssh-v user@host的输出 调试1:在/home/pumba/.ssh/known_hosts:1中找到密钥 debug1:在134217728块后重新密钥 调试1:SSH2_MSG_NEWKEYS已发送 debug1:应为SSH2_MSG_NewKeys debug1:在134217728块后
问题内容: 一般而言,我在Java身份验证框架和身份验证工作流程方面经验不足(仅了解一些理论知识),因此出于教育目的,我试图为我的HTTP应用程序创建这种类型的身份验证: 客户将登录名和密码发布到。 Shiro通过给定的凭据登录用户。服务器将其返回给客户。 客户要求某种资源。 Shiro按给定登录主题。然后,服务器执行常规的获取工作流(使用Shiro管理方法级访问权限)。 基本上我有以下问题: 我
我使用包括Spring Security和Vaadin在内的https://start.spring.io设置了一个Spring Boot项目。然后我将Vaadin版本设置为22.0.4,并按照本教程使用Vaadin Flow和Spring Security设置登录页面:https://vaadin.com/docs/v22/flow/tutorial/login-and-authenticati
客户已创建密钥存储库并存储凭据。为了验证密钥存储库,我已经在节点中创建了应用程序,并使用客户端id和客户端机密,我能够读取机密。但是现在客户不想使用客户id和客户机密,而是使用AZURE的用户名和密码来访问程序中的keyvault。它是一个没有MFA的keyvault访问的专用用户。 我不确定我们是否可以从节点JS使用用户名和密码访问keyvault。敬请建议。 谢谢