- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我是 Spring 新手(以及一般的 Web 开发),但我设法创建了一个简单的 Web 应用程序,现在我正在尝试为其添加身份验证支持,以便用户需要登录才能访问其功能.
我正在使用 Spring MVC 3.2.2、Spring Security 3.1.4 和 Tomcat 7。
出于测试目的,我能够使用硬编码的用户添加身份验证支持,并且一切正常。现在,我必须使用现有的 PostgreSQL 数据库来验证用户。我要强调的是,我的应用程序不支持创建用户;用户已经存储在数据库中。
以下是问题:
(1) 应用程序必须针对 PostgreSQL 数据库对用户进行身份验证,我无法以任何方式修改该数据库。
(2) 使用 crypt('plain text password', gen_salt(md5)) 对数据库中的密码进行哈希处理。
(3) 由于我大量使用了注解和xml配置,基本上大部分的辛苦工作都是由Spring完成的,这意味着很多事情都在幕后进行,我不知道。结果,我现在无法设置密码编码器必须用来验证用户身份的盐。这样的盐必须是存储在数据库中的已经散列的密码。
问题是:
如何告诉 Spring Security 使用存储在数据库中的哈希密码作为密码编码器的盐?有什么方法可以从 xml 执行此操作,还是我需要继续实现某些类?
我在网上进行了广泛的搜索,到目前为止我发现的所有示例都与我所做的有很大的不同,主要是因为在示例中,大多数功能都是由开发人员实现的,而不是主要依赖于内置功能.
这是安全.xml 文件:
<http use-expressions="true">
<intercept-url pattern="/resources/images/**" access="permitAll" requires-channel="any"/>
<intercept-url pattern="/resources/css/**" access="permitAll" requires-channel="any"/>
<intercept-url pattern="/login*" access="permitAll" requires-channel="any"/>
<intercept-url pattern="/**" access="hasAnyRole('ROLE_Processer', 'ROLE_Verifier', 'ROLE_Approver', 'ROLE_Supervisor', 'ROLE_Admin')" requires-channel="any"/>
<session-management>
<concurrency-control max-sessions="1" expired-url=/login?expired=true" session-registry-alias="sessionRegistry"/>
</session-management>
<form-login
login-page="/login"
default-target-url="/"
always-use-default-target="true"
authentication-failure-url="/login?error=true"/>
<logout logout-success-url="/login" invalidate-session="true" delete-cookies="JSESSIONID"/>
</http>
<authentication-manager>
<authentication-provider>
<jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="SELECT id AS username, password, enabled FROM users WHERE id=?;"
authorities-by-username-query="SELECT id AS username, role FROM users WHERE id=?;"
role-prefix="ROLE_"/>
<password-encoder hash="md5">
<salt-source ???/>
</password-encoder>
</authentication-provider>
</authentication-manager>
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<listener>
<listener-class>
org.springframework.security.web.session.HttpSessionEventPublisher
</listener-class>
</listener>
<beans:bean id="dataSource" class="org.springframework.jdbc.datasource.SimpleDriverDataSource">
<beans:property name="driverClass" value="org.postgresql.Driver"/>
<beans:property name="url" value="jdbc:postgresql://host:port/database"/>
<beans:property name="username" value="username"/>
<beans:property name="password" value="password"/>
</beans:bean>
private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);
/**
* Displays the Login form.
*/
@RequestMapping(value="/login", method=RequestMethod.GET)
public String displayLoginForm(@RequestParam(value="error", required=false) String error, @RequestParam(value="expired", required=false) String expired, Model model) {
LOGGER.info("Displaying Login form:: displayLoginForm(Model)");
if (error != null) {
LOGGER.info("Invalid username or password.");
model.addAttribute("error", "Invalid username or password.");
}
if (expired != null) {
LOGGER.info("Session has been expired (possibly due to multiple concurrent logins being attempted as the same user)");
model.addAttribute("expired", "Session has been expired (possibly due to multiple concurrent logins being attempted as the same user).");
}
return "login";
}}
<password-encoder hash="md5">
<salt-source user-property="password"/>
</password-encoder>
因为,根据我通过阅读
documentation 的理解,这是存储在数据库中的用户密码。但是,它不起作用。每次我尝试登录时,都会收到无效的凭据消息;但是,凭据确实有效。
最佳答案
好吧,为了解决我的问题,我实现了一个自定义密码编码器。基本上,我覆盖了 PasswordEncoder 接口(interface)的匹配方法:
@Override
public boolean matches(CharSequence rawPassword, String encodedPassword) {
//encoding raw password: the given encodedPassword serves as the salt
String sql = "SELECT crypt(?, ?) as hashedpwd;";
String hashedPassword = aJdbcTemplate.query(sql, new String[] {rawPassword.toString(), encodedPassword}, new ResultSetExtractor<String>() {
@Override
public String extractData(ResultSet rs) throws SQLException, DataAccessException {
rs.next();
return rs.getString("hashedpwd");
}
});
return encodedPassword.equals(hashedPassword.toString());
}
关于spring-mvc - Spring 安全 : use hashed password stored in database as salt of password encoder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18156883/
在设置了 salt-master 和一个 minion 后,我可以接受 master 上的 key 。运行 sudo salt-key -L表明它被接受。但是,当我尝试使用 test.ping 时命令
当我使用管道运行任何命令或在其中重定向时,它会失败。 master 和 minion 都在为测试 Salt 而创建的 Digital Ocean 上的新 Ubuntu 14.04 机器上运行。 两者都
这里的 Salt 中 [] 是什么意思? httpd: pkg.installed: [] file.managed: - name: /etc/httpd/conf/httpd.co
我正在寻找一种简单的方法来获取有关内存使用情况的信息,例如盐小兵的空闲内存。 到目前为止,我知道可以使用salt '*' grains.items列出总内存,但是我什至不知道如何仅列出总内存而不是所有
在 Saltstack 中,我有以下用例: 有一个状态 redis.sls 可以被其他状态包含。 redis.sls 的结果应该根据包含 redis.sls 的状态进行不同的配置。 例如: redis
我有一个带有盐状态的存储库,用于在云中配置我的服务器集群。随着时间的推移,我不断添加更多状态 - .sls文件 - 进入这个 repo。现在我开始挣扎什么是什么,什么是哪里。 我想知道是否有一些软件实
有没有办法加入两个支柱文件? 我有一个用户支柱。它是这样的: users: joe: sudouser: True jack: sudouser: False 现在我需要为某些
我在家庭实验室中使用 Saltstack,在测试它们时,我经常发现自己检查了一些稍有破坏的规则。我希望能够检查它们的有效性,否则在本地和 Jenkins 实例上对它们进行 lint,但我找不到任何有关
我有一个场景,如果另一个服务已经在运行,我需要采取行动。具体来说,我想安装 snmp 监控,例如,如果 mysql 已经在运行。 我知道这样做的“正确”方法是安装 mysql 及其基于支柱数据、gra
我正在尝试构建一个总是会重启服务的 .sls 文件: systemd-resolved: service.running: - restart: True 部署后,这会给出 I
(这是我在 salt 用户组 FWIW 上提出的问题的副本) 我需要编写一个状态来安装一些Windows服务器功能,重新启动minion,然后安装更多软件。似乎所有的部分都在那里(cmd.wait、s
“salt”在字符串到键 (s2k) 说明符中指什么? 它似乎是一个随机数生成器,可以改变事物,但我想知道“盐”代表什么? 例如这样写: 3.6.1.2. Salted S2K This inc
我正在尝试构建一个总是会重启服务的 .sls 文件: systemd-resolved: service.running: - restart: True 部署后,这会给出 I
我有一个 AWS 设置,其中有一个指定的 salt master,它接受所有传入的 key 和基于子网/指定 ip 地址的规定。如何在不登录主服务器的情况下立即在连接时配置我的 minions? 最佳
我想要一个 Salt 状态来管理我的 SSH 文件。这需要多个 file.line操作。我怎样才能做到这一点? 更新:请参阅问题底部以了解我当前的解决方法 我有的是这个: Secure SSH:
我正在验证用户电子邮件地址。 大多数人告诉的方式是创建一些独特的 token 并将其存储在 db 中 发送给用户。 我只是用全站盐散列(sha256)电子邮件地址来做这件事 并将此哈希发送给用户。 我
国家file.managed has defaults和 context模板渲染选项。两者都为模板变量提供上下文。 它们之间有什么区别? 最佳答案 defaults是在 context 情况下将传递给
我刚开始使用 Salt 而不是 Ansible。我不确定是从 master 调用以下脚本还是手动将命令输入 salt 状态。对于后者,任何人都可以建议如何使用 cmd.run 实现此目的。 #!/bi
我刚开始使用 Salt 而不是 Ansible。我不确定是从 master 调用以下脚本还是手动将命令输入 salt 状态。对于后者,任何人都可以建议如何使用 cmd.run 实现此目的。 #!/bi
我用了一个月的 salt 。每当我运行命令说 sudo salt '*' test.ping 时,master 就会对所有 minions 执行 ping 操作,响应是所有已启动并正在运行的 mini
我是一名优秀的程序员,十分优秀!