Spring Boot,使用编码密码

时间:2018-07-27 15:04:13

标签: java spring hash spring-security login

我正在使用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>

2 个答案:

答案 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=?");
 })

非常感谢朝鲜蓟