使用JPA和spring security进行自定义登录

时间:2016-08-26 18:18:13

标签: java spring authentication jpa spring-security

我一直试图通过spring security来验证我的服务。为此,我使用过滤器作为

这是我一直使用的安全配置:在此配置中,我通过身份验证过滤所有请求并允许所有请求。对于身份验证,我有登录页面。在登录表单中,我使用了'用户名'用于电子邮件和密码'分别用于属性名称的密码。

public class LoginAuthenticate  extends WebSecurityConfigurerAdapter{

    @Autowired
    @Qualifier("userDetailsService")
    MyUserDetailService userDetailsService;     

   @Autowired
   @Override
   public void configure(AuthenticationManagerBuilder auth) throws Exception {
       auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());
       System.out.println("reaching");
   }        

    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.authorizeRequests()
        .antMatchers("/resources/**").permitAll() 
        .anyRequest().authenticated()
      .and()
      .formLogin()
          .loginPage("/login")
          .usernameParameter("username")
          .passwordParameter("password")
          .defaultSuccessUrl("/success")
          .failureUrl("/")
          .permitAll()
          .and()
      .logout()
          .permitAll().and().csrf().disable();
    }
    @Bean
    public PasswordEncoder passwordEncoder(){
        PasswordEncoder encoder = new BCryptPasswordEncoder();
        return encoder;
    }

这是我的程序结构

Structure of program

为了实施UserDEtailService,我做了以下

这是我覆盖的UserDetailsService,我已经自动安装了存储库以从数据库中获取电子邮件地址和密码[使用电子邮件作为用户名],然后使用用户名和密码创建了userdetails用户对象并返回那个对象。当用户在登录页面输入用户名和密码时,我应该能够使用从数据库中提取的详细信息进行身份验证,例如用户的电子邮件和密码应该与从db中检索到的电子邮件和密码相匹配。但问题是我无法在spring安全配置中激活authenticate方法:

@Service("userDetailsService")
public class MyUserDetailService implements UserDetailsService{
@Autowired  
 IUsers userrepo;

        @Override
        public UserDetails loadUserByUsername(String username)
                throws UsernameNotFoundException {
            User user = userrepo.finduserByUserName(username);
            if (user == null) {
                return null;
            }
            List<GrantedAuthority> auth = AuthorityUtils
                    .commaSeparatedStringToAuthorityList("ROLE_USER");
            if (username.equals("admin")) {
                auth = AuthorityUtils
                        .commaSeparatedStringToAuthorityList("ROLE_ADMIN");
            }
            String password = user.getLoginPassword();
            String Email = user.getEmailAddress();
            System.out.println(password+ " "+ Email);
            return new org.springframework.security.core.userdetails.User(Email,password,auth);
}
}

但是我的身份验证功能没有评估用户!

有人可以帮我解决这里出了什么问题。调试没有错误。如果达到身份验证功能,我会安慰,但不会达到。我使用JPA在这个自定义登录上尝试了互联网上的所有可能的东西,但是我的努力并没有让任何事情变得富有成效。

1 个答案:

答案 0 :(得分:0)

在课程LoginAuthenticate中:在@Autowired之前删除void configure(AuthenticationManagerBuilder auth)
为此类添加注释

@Configuration    
@EnableWebSecurity


在类MyUserDetailService.loadUserByUsername中:
更改

if (user == null) {
      return null;
}

if (user == null) {
      throw new UsernameNotFoundException ("User not found");
}