Spring Security 4.2.2 - 使用密码解密代理密钥

时间:2017-06-09 03:04:46

标签: java spring encryption spring-security

问候StackOverflow!长期读者,第一次贡献者。

我正在开发一个个人项目,允许登录用户将加密的笔记存储给自己或家人。经过大量研究后,我决定实施一种代理密钥方法,在创建帐户时为每个用户分配一个代理密钥。

此代理密钥已加密并存储在数据库中......并在登录时使用用户密码进行解密。然后,生成的明确代理键用于其配置文件中的所有加密活动。

我的问题是在登录期间捕获用户的密码,同时使用本教程的Spring Security实现:

Spring Boot MVC Spring Security Tutorial

我的SecurityConfig类看起来像这样:

    /*
 * (non-Javadoc)
 * 
 * @see org.springframework.security.config.annotation.web.configuration.
 * WebSecurityConfigurerAdapter#configure(org.springframework.security.
 * config.annotation.web.builders.HttpSecurity)
 */
@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/login").permitAll()
            .antMatchers("/registration").permitAll().antMatchers("/accountverification/**").permitAll()
            .antMatchers("/secure/**").hasAuthority("MEMBER").anyRequest().authenticated().and().formLogin()
            .loginPage("/login").failureUrl("/login?error=true").defaultSuccessUrl("/secure/notes")
            .usernameParameter("email").passwordParameter("password").and().logout()
            .logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/").and()
            .exceptionHandling().accessDeniedPage("/access-denied");
}

我的login.html页面就像这样(重要的部分):

<form th:action="@{/login}" method="POST" class="form-signin">

如果我正确理解了事情,那么login.html页面将发布到/ login,这是在我的SecurityConfig类(上面)中定义的。登录本身非常有用。

然而,这会自动绕过我解密该代理键的流程部分。所以,我首先尝试发布到一个单独的控制器,然后将该请求转发到/ login。没有骰子。

然后我尝试扩展HandleInterceptorAdapter,但发现此时的密码仍然是null。这导致我发表这篇文章:

UserDetails getPassword returns null in spring security 3.1...

......但是这让我感到很害羞。

所以,最后,我仍然想知道如何在登录屏幕的帖子中抓取密码以临时使用解密用户的代理键...然后当解密完成并且登录完成时......摧毁它。

感谢任何帮助!

1 个答案:

答案 0 :(得分:-1)

我知道会发生这种情况......只要我在StackOverflow上发布一些奇特的问题,我就会弄明白。

我不确定它是最优雅的解决方案,但它确实有效。我当然愿意接受替代方案。

我将此方法添加到我的登录控制器:

/**
 * @return
 */
@RequestMapping(value = { "/loginProcessor" }, method = RequestMethod.POST)
public String loginProcessor(@ModelAttribute Login login) {
    System.out.println("PASSWORD: " + login.getPassword());
    return "forward:/login";
}

然后我调整了login.html发布到它,而不是/ login:

<form th:action="@{/loginProcessor}" method="POST" class="form-signin">

我更新了我的SecurityConfig以适应这两条路径:

/*
 * (non-Javadoc)
 * 
 * @see org.springframework.security.config.annotation.web.configuration.
 * WebSecurityConfigurerAdapter#configure(org.springframework.security.
 * config.annotation.web.builders.HttpSecurity)
 */
@Override
protected void configure(HttpSecurity http) throws Exception {

    http.authorizeRequests().antMatchers("/").permitAll().antMatchers("/loginProcessor").permitAll()
            .antMatchers("/login").permitAll().antMatchers("/registration").permitAll()
            .antMatchers("/accountverification/**").permitAll().antMatchers("/secure/**").hasAuthority("MEMBER")
            .anyRequest().authenticated().and().formLogin().loginPage("/login").failureUrl("/login?error=true")
            .defaultSuccessUrl("/secure/notes").usernameParameter("email").passwordParameter("password").and()
            .logout().logoutRequestMatcher(new AntPathRequestMatcher("/logout")).logoutSuccessUrl("/").and()
            .exceptionHandling().accessDeniedPage("/access-denied");
}
瞧,瞧!密码已打印,我已登录并重定向到我的个人资料页面。还有更好的方法吗?