Проблемы Spring Security (конфигурации Java)

Всем привет,

У меня есть задача, где я должен создать 3 страницы: / логин- там, где у нас есть ввод электронной почты и пароль, / результат - где мы должны сообщить пользователю, прошел ли он аутентификацию или нет, и в случае успеха мы можем показать 3-ю страницу - /dataEntry, где мы можем сохранить информацию о пользователе в базе данных.

Отличие типичного проекта в том, что электронная почта пользователей и пароли находятся в USERS.XML, а не в базе данных (БД).

Я разобрал это саксофоном и домом.

Parser возвращает HashMap, где "ключ" - это "электронная почта", а "значение" - "пароль".

Чем я делал домены по умолчанию:

1) Login.class - это основной класс для аутентификации и работы только с users.xml. Имеет следующие поля: адрес электронной почты, пароль.

2) User.class - для работы с БД (сохранение, обновление, загрузка информации о пользователе). Он имеет следующие поля: id, email, firstName, secondName, пол.

Далее я сделал дао и сервисные уровни этих доменов. В нижней части моего запроса я дам ссылку на bitbucket, но, пожалуйста, прочитайте все мои вопросы.

Я настраиваю проект через Java, поэтому я выполнил настройку Hibernate (она работает правильно), веб-конфигурацию (кажется, что она тоже работает правильно) и настройку безопасности (в данный момент я хочу начать плакать).

Моя настройка безопасности:

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");
}

CustomUserDetailsService

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(String email) никогда не вызывается.

SecurityContext возвращает мне anonymusUser, даже если я ввел правильный адрес электронной почты и пароль. Поэтому я не могу получить доступ к странице /dataEntry.

ССЫЛКА НА BITBUCKET: Bitbucket

Кто-нибудь, пожалуйста, помогите мне. Спасибо много.

1 ответ

Решение

Нужно добавить login-processing-url как "/j_spring_security_check" для работы и добавить действие в вашей форме входа в систему как "j_spring_security_check". Подробнее здесь: Весенняя миграция

Другие вопросы по тегам