Spring security не дает пройти авторизацию

93
19 июня 2019, 20:50

Есть проект web приложения с использованием Spring security с использованием бд со следующей структурой:

Дело в том, что мой spring security, по какой-то причине, не авторизует меня даже если я ввожу пароль и логин те, что есть в базе данных. После ввода он опять перебрасывает меня на страницу авторизации. Возможно я допустил ошибку в написании CustomUserDetails и LoginService,который имплементит UserDetailsService. web.xml у меня содержит только :

    <?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
</web-app>

так как все конфиги у меня заданы в Java классах. WebConfig:

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "web.controller")
@Import({ SecurityConfig.class })
public class WebConfig implements WebMvcConfigurer {
    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver bean = new InternalResourceViewResolver();
        bean.setViewClass(JstlView.class);
        bean.setPrefix("/WEB-INF/views/");
        bean.setSuffix(".jsp");
        return bean;
    }
}

SpringConfig:

@Configuration
public class SpringConfig {
    @Bean
    public JdbcTemplate getJdbcTemplate(){
         return new JdbcTemplate(getDataSource());
    }
    @Bean
    public DataSource getDataSource() {
        DriverManagerDataSource dataSource=new DriverManagerDataSource();
        dataSource.setUrl("jdbc:mysql://localhost:3306/vebinar?useSll=false&useUnicode=true&useJDBCCompliantTimezoneShift=true&useLegacyDatetimeCode=false&serverTimezone=UTC");
        dataSource.setUsername("root");
        dataSource.setPassword("Magdenberg");
        dataSource.setDriverClassName("com.mysql.jdbc.Driver");
        return dataSource;
    }
    @Bean
    public UserDao getUserDao(){
        return new UserDaoIml(getJdbcTemplate());
    }
    @Bean
    public UserService getUserService(){
        return new UserServiceImpl();
    }
    @Bean
    public LoginService getLoginService(){
        return new LoginService();
    }
    @Bean
    public CommonsMultipartResolver multipartResolver() {
        CommonsMultipartResolver resolver=new CommonsMultipartResolver();
        resolver.setDefaultEncoding("utf-8");
        return resolver;
    }
}

SecurutyConfig:

@EnableGlobalMethodSecurity(prePostEnabled = true)
@EnableWebSecurity
@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Autowired
    LoginService loginService;
    @Autowired
    DataSource dataSource;
    @Bean
    public AuthenticationSuccessHandler myAuthenticationSuccessHandler(){
        return new MySimpleUrlAuthenticationSuccessHandler();
    }
    private PasswordEncoder getPasswordEncoder() {
        return new PasswordEncoder() {
            @Override
            public String encode(CharSequence charSequence) {
                return charSequence.toString();
            }
            @Override
            public boolean matches(CharSequence charSequence, String s) {
                return true;
            }
        };
    }
    @Override
    public void configure(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.jdbcAuthentication().dataSource(dataSource).usersByUsernameQuery(
                "select user.nickname,user.password from alexeydb.user where nickname=?")
                .authoritiesByUsernameQuery(
                        "select roles.nickname,  roles.authority from alexeydb.roles where nickname=?")
                .passwordEncoder(getPasswordEncoder());
        auth.userDetailsService(loginService);
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception{
        http.csrf().disable();
        http.authorizeRequests().antMatchers("/**").authenticated()
                .anyRequest().permitAll()
                .and().formLogin().loginProcessingUrl( "/login" ).loginPage("/login").permitAll()
                .and().formLogin()
                //.successHandler(new MySimpleUrlAuthenticationSuccessHandler())
                .usernameParameter("nickname").passwordParameter("password")
                .failureForwardUrl("/login?error").and().logout().logoutSuccessUrl("/login")
                .and().exceptionHandling().accessDeniedPage("/403");
    }
    @Override
    public void configure(WebSecurity web) throws Exception {
        web.ignoring().antMatchers("/","/reg");
    }
}

MvcWebApplicationInitializer :

public class MvcWebApplicationInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[]{WebConfig.class, SpringConfig.class, SecurityConfig.class};
    }
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return null;
    }
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
}

SpringWebSecurityApplicationInitializer :

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

CustomUserDetails :

@Component
public class CustomUserDetails extends User implements UserDetails {
    private UserDao loginDao;
    public CustomUserDetails(final User user, UserDao _loginDao) {
        super(user);
        loginDao=_loginDao;
    }
    @Override
    public Collection<? extends GrantedAuthority> getAuthorities() {
        List<String> roles = loginDao.getUserRoles(getUsername());
        List<GrantedAuthority> grantedAuthorityList = new ArrayList<GrantedAuthority>();
        if(roles!=null){
            for(String role : roles){
                GrantedAuthority authority = new SimpleGrantedAuthority(role);
                grantedAuthorityList.add(authority);
            }
        }
        return grantedAuthorityList;
    }
    @Override
    public String getUsername() {
        return getNickname();
    }
    @Override
    public boolean isAccountNonExpired() {
        return true;
    }
    @Override
    public boolean isAccountNonLocked() {
        return true;
    }
    @Override
    public boolean isCredentialsNonExpired() {
        return true;
    }
    @Override
    public boolean isEnabled() {
        return true;
    }
}

LoginService:

@Service
public class LoginService implements UserDetailsService {
    @Autowired
    UserDao loginDao;
    public void setLoginDao(UserDao loginDao) {
        this.loginDao = loginDao;
    }
    @Override
    public CustomUserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        web.entity.User userInfo = loginDao.findByUsername(username);
        if(userInfo==null){
            throw new UsernameNotFoundException("user name not found");
        }
        List<String> roles = loginDao.getUserRoles(username);
        List<GrantedAuthority> grantedAuthorityList = new ArrayList<GrantedAuthority>();
        if(roles!=null){
            for(String role : roles){
                GrantedAuthority authority = new SimpleGrantedAuthority(role);
                grantedAuthorityList.add(authority);
            }
        }
        CustomUserDetails customUserDetails=new CustomUserDetails(userInfo,loginDao);
        return customUserDetails;
    }
}

Прилагаю весь проект по ссылке: https://bitbucket.org/denisbaic10000/java_web/downloads/

READ ALSO
javah в java 11

javah в java 11

В java 8 я использовал javah из папочки ${JAVA_HOME}/bin, а буквально недавно я обновился до Java 11 и там нет javahВ то же время я не могу использовать javah из Java 8 из-за...

100
Как однозначно выполнять перевод int -&gt; byte-&gt; int в Java?

Как однозначно выполнять перевод int -> byte-> int в Java?

Возможно ли в данном случае получить исходное 412?

79
Как вывести на экран каждую вторую букву слова? (java) [закрыт]

Как вывести на экран каждую вторую букву слова? (java) [закрыт]

Как вывести на экран каждую вторую букву любого слова?

81
SAX парсинг тегов

SAX парсинг тегов

Каким образом можно по тексту тегов, которые внутри тега отцовского, узнать какому именно отцу он пренадлежит и выдать все значение внутри...

117