spring security 4 java config用jpa加密密码

时间:2015-08-05 08:36:50

标签: spring-security

我需要一个登录策略来处理mysql数据库。我的用户表有md5密码加密。 我需要开发登录。我的代码不起作用。这是我的SecutiryConfig:

@Configuration
@EnableWebSecurity
@EnableGlobalAuthentication
@ComponentScan("org.ebook.*")
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    Environment env;

    @Autowired
    private UserRepository userRepository;

    @Autowired
    protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.userDetailsService(new UserService(userRepository)).passwordEncoder(passwordEncoder());
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests().antMatchers("/").hasAnyRole("USER", "ADMIN").antMatchers("/index")
                .hasAnyRole("USER", "ADMIN").antMatchers("/dashboard").hasAnyRole("USER", "ADMIN")
                .antMatchers("/login").hasRole("ANONYMOUS").and().formLogin().loginPage("/login")
                .defaultSuccessUrl("/dashboard").usernameParameter("username")
                .passwordParameter("password").and().rememberMe()
                .tokenValiditySeconds(Integer.parseInt(env.getProperty("session.tokenValidity")))
                .key(env.getProperty("session.key")).and().logout().logoutSuccessUrl("/login").and()
                .exceptionHandling().accessDeniedPage("/403").and().csrf();
    }

    @Bean
    public Md5PasswordEncoder passwordEncoder(){
        Md5PasswordEncoder encoder = new Md5PasswordEncoder();
        return encoder;
    }

}

并且是我的UserService:

@Service
@Transactional(readOnly = true)
public class UserService implements UserDetailsService {

    private UserRepository userRepository;

    @Autowired
    public UserService(UserRepository userRepository) {
        this.userRepository = userRepository;
    }

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {

        org.fingerlinks.ebook.model.bean.User user = null;
        if (userRepository!=null) {
            user = userRepository.findByUsername(username);
        }

        if (user != null) {

            List<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
            authorities.add(new SimpleGrantedAuthority("ROLE_USER"));

            return new User(user.getUsername(), user.getPassword(), authorities);
        }

        throw new UsernameNotFoundException("User '" + username + "' not found");
    }
}

我的问题是,如果我在用户表上使用带有加密密码的passwordEncoder,则登录页面中的用户无法登录。 但是如果我在java代码和用户表中删除编码,那么一切都运行良好。 任何人都可以帮我理解可怕的错误在哪里吗?

我正在使用spring 4.1.6和spring security 4.0.2。

2 个答案:

答案 0 :(得分:1)

保存用户密码时尝试此操作:

Md5PasswordEncoder encoder = new Md5PasswordEncoder();
user.setPassword(encoder.encode(user.getPassword()));

答案 1 :(得分:0)

Spring安全性对输入的密码进行编码并检查数据库密码。

在您的情况下,您将在数据库中存储普通密码而不是编码密码。使用Md5PasswordEncoder对密码进行编码并将其存储在数据库中。