从Spring Security 3.1.4.RELEASE开始,旧的org.springframework.security.authentication.encoding.PasswordEncoder 已经被弃用了org.springframework.security.crypto.password.PasswordEncoder.由于我的应用尚未向公众发布,我决定转向新的,而不是弃用的API.
到目前为止,我有一个ReflectionSaltSource自动使用用户的注册日期作为每用户盐密码.
String encodedPassword = passwordEncoder.encodePassword(rawPassword, saltSource.getSalt(user));
Run Code Online (Sandbox Code Playgroud)
在登录过程中,Spring还使用我的bean来验证用户是否可以登录.我无法在新密码编码器中实现这一点,因为SHA-1的默认实现 - StandardPasswordEncoder只能添加全局编码器创建过程中的秘密盐.
有没有合理的方法如何使用未弃用的API进行设置?
我有一个使用spring框架和spring安全性的java Web应用程序进行登录.在我的数据库中,我在保存之前将我的密码加密到MD5.我在application-config.xml中添加了这段代码
<security:authentication-provider>
<security:password-encoder hash="md5"/>
<security:jdbc-user-service
data-source-ref="dataSource"
users-by-username-query="select user_name username, user_password password, 1 enabled from users where user_name=?"
authorities-by-username-query="select username, authority from authorities where username=?" />
</security:authentication-provider>
Run Code Online (Sandbox Code Playgroud)
起初它在数据库中的密码未加密时起作用.但是当我加密它并在我的应用程序配置中添加了这个片段
<security:password-encoder hash="md5"/>
Run Code Online (Sandbox Code Playgroud)
我无法登录.
我已经使用spring security实现了更改密码功能,但((UserDetails)principal).getPassword())为登录用户返回null.
如果我没记错的话,过去常常在3.0中使用.这是在3.1中更改,以便无法检索登录用户的当前密码?
在下面的代码中,我正在检查从网页输入的用户密码中的当前密码.然后我检查登录用户的密码是否与输入的密码匹配.如果是,那么我想设置oldPasswordMatchNewPassword = true.
我该如何实现此功能?
@RequestMapping(value = "/account/changePassword.do", method = RequestMethod.POST)
public String submitChangePasswordPage(
@RequestParam("oldpassword") String oldPassword,
@RequestParam("password") String newPassword) {
Object principal = SecurityContextHolder.getContext()
.getAuthentication().getPrincipal();
String username = principal.toString();
if (principal instanceof UserDetails) {
username = ((UserDetails) principal).getUsername();
System.out.println("username: " + username);
System.out.println("password: "
+ ((UserDetails) principal).getPassword());
if (((UserDetails) principal).getPassword() != null) {
if (((UserDetails) principal).getPassword().equals(oldPassword)) {
oldPasswordMatchNewPassword = true;
}
}
}
if (oldPasswordMatchNewPassword == true) {
logger.info("Old password matches new password. Password will be updated."); …Run Code Online (Sandbox Code Playgroud) 我想加盐如:
PasswordEncoder encoder = new ShaPasswordEncoder();
userDetails.setPassword(encoder.encodePassword(userDetails.getPassword(),saltSource.getSalt(userDetails));
Run Code Online (Sandbox Code Playgroud)
到目前为止userDetails我的自定义UserDetail类的实例,我不得不把它投射到这个Spring类:UserDetails
,但是从逻辑上预期我得到了运行时:
java.lang.ClassCastException: model.UserDetails cannot be cast to org.springframework.security.core.userdetails.UserDetails
Run Code Online (Sandbox Code Playgroud)
配置:
<beans:bean id="saultSource" class="org.springframework.security.authentication.dao.ReflectionSaltSource">
<beans:property name="userPropertyToUse" value="username"/>
</beans:bean>
<authentication-manager alias="authenticationManager">
<authentication-provider>
<password-encoder hash="sha">
<salt-source user-property="username"/>
</password-encoder>
<jdbc-user-service data-source-ref="dataSource"/>
</authentication-provider>
</authentication-manager>
Run Code Online (Sandbox Code Playgroud)
在这种情况下如何正确配置盐?