我正在使用Spring Boot,Spring Sec,mySQL开发Java密码管理器。 我的登录页面效果很好,我有两种用户:ADMIN和NORMAL。 管理员可以创建一个新用户,并且在发生这种情况时,新用户将使用哈希密码和明文用户名保留在db上。我的 webController 类别如下:
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
@RequestMapping(value = { "/login" })
public String login() {
return "login";
}
@RequestMapping(value = "/insertuser", method = RequestMethod.GET)
public String insertuser(ModelMap modelMap) {
modelMap.put("user", new User());
return "insertuser";
}
@RequestMapping(value = "insertuser", method = RequestMethod.POST)
public String insertuser(
@ModelAttribute("user") User user, ModelMap modelMap) throws NoSuchAlgorithmException, InvalidKeySpecException {
String encodedPassword = bCryptPasswordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword);
userService.addUser(user);
return "home";
}
在这里,我们有 SecurityConfig 类
@Configuration
@EnableAutoConfiguration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
DataSource dataSource;
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth.jdbcAuthentication().dataSource(dataSource)
.usersByUsernameQuery("select username,password,enabled from user where username=?")
.authoritiesByUsernameQuery("select usernameusr, role from userroles where usernameusr=?");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http.authorizeRequests().antMatchers("/", "/home").permitAll().antMatchers("/admin", "/getrole", "/getusers", "/insertuser").hasRole("ADMIN")
.anyRequest().authenticated().and().formLogin().loginPage("/login").permitAll().and().logout()
.permitAll();
http.exceptionHandling().accessDeniedPage("/403");
}
}
在db上,管理员保存的新用户的哈希值是password。
用户名:anakin
密码:$ 2a $ 10 $ .AVpjhbsVKfGtMxiKlTts.2yiiKB0gF7xu2lrL6o3iEWqIMDgM43。
明文密码为: vader
现在,如果我注销并尝试使用用户凭据anakin / vader登录,则会收到错误的凭据错误。
如何使用编码后的密码进行正确的登录? 我知道我们需要获取提交的清除密码,应用哈希函数,如果它与db上的哈希密码匹配,则登录成功结束,但是我如何实现此方法?
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:th="http://www.thymeleaf.org"
xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
<head>
<title>PASSWORDMANAGER</title>
<div th:replace="fragments/header :: header-css"/>
</head>
<body>
<div th:replace="fragments/header :: header"/>
<h1 style="text-align: center">
<font size="20" color="blue">MAIPASSWORD HOME</font>
</h1>
<div style="text-align: center" th:if="${param.error}">
<h1 style="color: red">Bad Credentials. Try again.</h1>
</div>
<div style="text-align: center" th:if="${param.logout}">
<h1 style="color: blue">Logged out.</h1>
</div>
<form style="text-align: center" th:action="@{/login}" method="post">
<p>
<input type="text" name="username" value="" placeholder="username" />
</p>
<p>
<input type="password" name="password" value=""
placeholder="password" />
</p>
<p class="submit">
<input type="submit" value="Log In" />
</p>
</form>
<div th:replace="fragments/footer :: footer"/>
</body>
</html>
答案 0 :(得分:0)
在auth对象末尾的configAuthentication调用passwordEncoder中,并传递自动装配的密码编码器。这将自动处理密码的编码并尝试使用它进行登录。
答案 1 :(得分:0)
好的,现在一切正常。在我的 WebController Java文件中添加以下代码。
@Autowired
private BCryptPasswordEncoder bCryptPasswordEncoder;
String encodedPassword = bCryptPasswordEncoder.encode(user.getPassword());
user.setPassword(encodedPassword);}
在我的 SecurityConfig
中 @Autowired
public PasswordEncoder BCryptPasswordEncoder() {
return new BCryptPasswordEncoder();}
@Autowired
public void configAuthentication(AuthenticationManagerBuilder auth) throws Exception {
auth
.jdbcAuthentication()
.dataSource(dataSource)
.passwordEncoder(BCryptPasswordEncoder()
.usersByUsernameQuery("select username,password,enabled from user where username=?")
.authoritiesByUsernameQuery
("select usernameusr, role from userroles where usernameusr=?");
})
非常感谢朝鲜蓟