Я пытаюсь внедрить сервис RememberMe для моего приложения Spring Security с управлением Spring Session.Я настроил SpringSessionRememberMeServices
и SpringSessionBackedSessionRegistry
bean-компоненты на основе Spring Session Documentation .Когда я пытаюсь выполнить автоматическое подключение FindByIndexNameSessionRepository
, я получаю следующую ошибку
Could not autowire. No beans of 'FindByIndexNameSessionRepository<Session>' type found
SecurityConfig.java
package com.springtesting.security.config;
import com.springtesting.security.MyUserDetailsService;
import com.springtesting.security.handlers.CustomAuthenticationFailureHandler;
import com.springtesting.security.handlers.CustomAuthenticationSuccessHandler;
import com.springtesting.security.handlers.CustomLogoutSuccessHandler;
import com.springtesting.security.providers.CustomDaoAuthenticationProvider;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.authentication.AuthenticationManager;
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.security.web.session.HttpSessionEventPublisher;
import org.springframework.session.FindByIndexNameSessionRepository;
import org.springframework.session.Session;
import org.springframework.session.jdbc.config.annotation.web.http.EnableJdbcHttpSession;
import org.springframework.session.security.SpringSessionBackedSessionRegistry;
import org.springframework.session.security.web.authentication.SpringSessionRememberMeServices;
@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter
{
private final MyUserDetailsService userDetailsService;
private final FindByIndexNameSessionRepository<Session> sessionRepository;
@Autowired
public SecurityConfig(MyUserDetailsService userDetailsService, FindByIndexNameSessionRepository<Session> sessionRepository)
{
this.userDetailsService = userDetailsService;
this.sessionRepository = sessionRepository;
}
@Override
public void configure(AuthenticationManagerBuilder auth)
{
auth.authenticationProvider(getDaoAuthenticationProvider());
}
@Bean
public CustomDaoAuthenticationProvider getDaoAuthenticationProvider()
{
CustomDaoAuthenticationProvider daoAuthenticationProvider=new CustomDaoAuthenticationProvider();
daoAuthenticationProvider.setUserDetailsService(userDetailsService);
daoAuthenticationProvider.setPasswordEncoder(getBCryptPasswordEncoder());
return daoAuthenticationProvider;
}
/* BCrypt strength should 12 or more*/
@Bean
public PasswordEncoder getBCryptPasswordEncoder()
{
return new BCryptPasswordEncoder(12);
}
@Override
protected void configure(HttpSecurity http) throws Exception
{
http.authorizeRequests()
.antMatchers("/anonymous*").anonymous()
.antMatchers("/users/**").hasAuthority(AuthorityConstants.Admin)
.antMatchers("/admin**").hasAuthority(AuthorityConstants.Admin)
.antMatchers("/profile/**").hasAuthority(AuthorityConstants.User)
.antMatchers("/api/**").hasAuthority(AuthorityConstants.ApiUser)
.antMatchers("/dba/**").hasAuthority(AuthorityConstants.Dba)
.anyRequest().authenticated()
.and()
.httpBasic()
.and()
.formLogin()
.loginPage("/login")
.loginProcessingUrl("/login")
.successHandler(new CustomAuthenticationSuccessHandler())
.failureHandler(new CustomAuthenticationFailureHandler())
.permitAll()
.and()
.logout()
.deleteCookies("JSESSIONID")
.logoutSuccessHandler(new CustomLogoutSuccessHandler())
.permitAll()
.and()
.rememberMe().rememberMeServices(springSessionRememberMeServices());
http.sessionManagement()
.invalidSessionUrl("/invalidSession.html")
.sessionFixation()
.migrateSession()
.maximumSessions(1)
.sessionRegistry(sessionRegistry());;
}
@Bean
public SpringSessionRememberMeServices springSessionRememberMeServices()
{
SpringSessionRememberMeServices rememberMeServices = new SpringSessionRememberMeServices();
// optionally customize
rememberMeServices.setRememberMeParameterName("remember-me");
rememberMeServices.setValiditySeconds(86000);
return rememberMeServices;
}
@Bean
SpringSessionBackedSessionRegistry sessionRegistry()
{
return new SpringSessionBackedSessionRegistry<>(this.sessionRepository);
}
@Override
public void configure(WebSecurity web) throws Exception
{
web
.ignoring()
.antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**");
}
@Bean
public HttpSessionEventPublisher httpSessionEventPublisher()
{
return new HttpSessionEventPublisher();
}
@Bean("authenticationManager")
@Override
public AuthenticationManager authenticationManagerBean() throws Exception
{
return super.authenticationManagerBean();
}
}
application.properties
################################### MySQL Database as persistent Database ##############################
spring.jpa.hibernate.ddl-auto=update
spring.datasource.url=jdbc:mysql://localhost:3306/springsecuritydb?useSSL=false
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.datasource.username=root
spring.datasource.password=bcmc1234
management.endpoints.web.exposure.include=*
management.endpoint.auditevents.enabled=true
spring.session.store-type=jdbc
# Name of the database table used to store sessions.
spring.session.jdbc.table-name=SPRING_SESSION
# Database schema initialization mode
spring.session.jdbc.initialize-schema=always
#server.servlet.session.timeout=
#spring.session.jdbc.schema=classpath:org/springframework/session/jdbc/schema-@@platform@@.sql # Path to the SQL file to use to initialize the database schema.
spring.devtools.restart.enabled=true
server.servlet.session.cookie.http-only=true
server.servlet.session.cookie.secure=false
https://docs.spring.io/spring-session/docs/current/reference/html5/#spring-security