2016-08-10 164 views
0

大家好,春季安全(Java的配置)问题

我有一个任务,我要创建3页: /登录 - 在那里我们有电子邮件地址和密码输入, /结果 - 我们必须告诉用户他是否已验证,如果成功,我们可以显示第3页 - /dataEntry我们可以在DataBase中保存或更新用户的信息。

典型项目的差异是用户的电子邮件和密码在users.xml中没有数据库(DB)

我已经萨克斯DOM解析它。

分析器返回HashMap的其中 '关键' 是 '电子邮件 '和' ' 是 '密码'。

比我默认域:

1)Login.class - 是主类,以权威性,并只与users.xml中工作。它有下一个领域:电子邮件,密码。

2)User.class - 使用DB(保存,更新,加载用户信息)。它具有下列字段:身份证,电子邮件,名字,第二名,性别。

接下来我做了dao服务层的这个域。 在我问的底部,我会给一个bitbucket的链接,但请阅读我的问题。

我用Java的配置项目,所以我也Hibernate配置(它的工作原理是正确的),Web配置(好像它正常工作太)和安全配置(此时我要开始哭) 。

我的安全配置:

SecurityWebApplicationInitializer

public class SecurityWebApplicationInitializer extends AbstractSecurityWebApplicationInitializer { 
public SecurityWebApplicationInitializer() { 
} 

SecurityConfiguration

public class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

/** 
* Holds userDetailsService 
*/ 
@Autowired 
@Qualifier("customUserDetailsService") 
UserDetailsService userDetailsService; 

/** 
* Gets BCryptPasswordEncoder object. 
* 
* @return BCryptPasswordEncoder object. 
*/ 
@Bean 
public PasswordEncoder passwordEncoder() { 
    return new BCryptPasswordEncoder(); 
} 

/** 
* Gets DaoAuthenticationProvider with its parameters 
* 
* @return authenticationProvider 
*/ 
@Bean 
public DaoAuthenticationProvider authenticationProvider() { 
    DaoAuthenticationProvider authenticationProvider = new DaoAuthenticationProvider(); 
    authenticationProvider.setUserDetailsService(userDetailsService); 
    authenticationProvider.setPasswordEncoder(passwordEncoder()); 
    return authenticationProvider; 
} 

/** 
* Sets GlobalSecurity parameters. 
* 
* @param auth - AuthenticationManagerBuilder object. 
* @throws Exception 
*/ 
@Autowired 
public void configureGlobalSecurity(AuthenticationManagerBuilder auth) throws Exception { 
    auth.authenticationProvider(authenticationProvider()); 
} 

/** 
* Sets Encoding parameters to work with russian locale, filters to get access to any page. 
* /index is login and logout page by default - everybody can open this page. 
* /result is page with results of login - everybody can open this page. 
* /dataEntry is page to save/update/load user's info - only registered user can open this page. 
* 
* @param http - {@link HttpSecurity} object 
* @throws Exception 
*/ 
@Override 
public void configure(HttpSecurity http) throws Exception { 
    //To work with UTF-8 and RU locale 
    CharacterEncodingFilter f = new CharacterEncodingFilter(); 
    f.setEncoding("UTF-8"); 
    f.setForceEncoding(true); 

    http 
      .addFilterBefore(f, CsrfFilter.class) 
      .formLogin().loginPage("/index").defaultSuccessUrl("/result") 
      .usernameParameter("email").passwordParameter("password") 
      .and().logout().logoutSuccessUrl("/index").invalidateHttpSession(true) 
      .and().httpBasic().realmName("ArtezioWebApp") 
      .and().authorizeRequests() 
      .antMatchers("/", "/index", "/result/**").permitAll() 
      .antMatchers("/result/**").hasAnyAuthority("ROLE_USER","ROLE_ANONYMOUS") 
      .antMatchers("/dataEntry/**").hasAuthority("ROLE_USER") 
      .and().csrf() 
      .and().exceptionHandling().accessDeniedPage("/result?error"); 
} 

CustomUserDetailsS​​ervice

public class CustomUserDetailsService implements org.springframework.security.core.userdetails.UserDetailsService { 

/** 
* Holds logger. 
*/ 
private static final Logger logger = LoggerFactory.getLogger(CustomUserDetailsService.class); 

/** 
* Holds {@link LoginService} object 
*/ 
@Autowired 
@Qualifier("loginService") 
private LoginService loginService; 

@Autowired 
@Qualifier("login") 
Login login; 

/** 
* Gets UserDetailsService object with parameters - email, password, authorities. 
* 
* @param email - by default has alias 'userName' 
* @return UserDetailsService object with email,password and authorities. 
* @throws UsernameNotFoundException if user was not found in *.xml file. 
*/ 
@Override 
public UserDetails loadUserByUsername(String email) throws UsernameNotFoundException { 
    //All users emails and passwords 
    HashMap<String, String> h = loginService.getUsers(); 
    logger.info("Searching user with email '{}'...", email); 

    if (loginService.isValidEmail(email)) { 
     logger.info("User with email '{}' was found.", email); 

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

     //Saves data in Login object 
     login.setPassword(h.get(email)); 
     login.setEmail(email); 
     return new org.springframework.security.core.userdetails.User(login.getEmail(), 
       login.getPassword(), true, true, true, true, authorities); 
    } 
    throw new UsernameNotFoundException("User with email '" + email + "' not found."); 
} 

当我调试项目时,我发现@Overloaded方法loadByUsername(字符串电子邮件)永远不会被调用。

即使我输入了正确的电子邮件和密码,SecurityContext也会返回anonymusUser。 所以我不能访问/ dataEntry页面。

LINK TO到位桶:Bitbucket

有人请帮助我。 非常感谢。

回答

0

需要将login-processing-url添加为“/ j_spring_security_check”才能在您的登录表单上添加“j_spring_security_check”操作。 Read more here:Spring migration