Я проверял вчера вечером и обнаружил, что могу создать токен, когда мама входит в систему, и сохранить его в базе данных. поэтому я провел всю ночь, пытаясь заставить Spring Security сохранить сеанс токена в базе данных, чтобы пользователь мог сохранить своего пользователя на следующий день. Я использовал несколько ссылок, поскольку некоторые старые методы среды Spring больше не поддерживаются. Я не знаю, где еще искать, поэтому опубликую здесь соответствующую часть кода и конфигурации, так что, возможно, вы порекомендуете некоторые изменения.
Код: Выделить всё
@Configuration
@EnableWebSecurity
public class SecurityConfig {
@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
http.addFilterBefore(rememberMeFilter(),RememberMeAuthenticationFilter.class)
.authenticationManager(authenticationManagerBean()).
authorizeHttpRequests((requests) -> requests
.requestMatchers( "/WEB-INF/jsp/**","/ofiweb/css/**",
"/ofiweb/img/**","/ofiweb/lib/**",
"/css/**",
"/mimg/**","/msass/**","/mjs/**",
"/mcss/**",
"/img/**","/lib/**"
).permitAll()
.requestMatchers("/_ofiwebadmin/**").hasAnyAuthority("ROOT","OFFICE_ADMIN")
.requestMatchers("/creditcards/discounts", "/configuration/sftp").hasAnyAuthority("ROOT", "OFFICE_ADMIN")
.anyRequest().authenticated()
).csrf(AbstractHttpConfigurer::disable)
.rememberMe(rememberMe -> rememberMe
.key("Changed :P:P")
.tokenValiditySeconds(31536000)//1 Year if possible
.rememberMeParameter("remember-me")
.tokenRepository(persistentTokenRepository())
.userDetailsService(userDetailService())
.rememberMeServices(rememberMeServices())
.alwaysRemember(true)
)
.formLogin((form) -> form
.loginPage("/login").
permitAll()
)
.logout( logout -> logout
.logoutUrl("/logout")
.permitAll() );
//.logout((logout) -> logout.deleteCookies("SESSION"));
return http.build();
}
@Bean
public UsernamePasswordAuthenticationFilter usernamePasswordAuthenticationFilter()
throws Exception {
UsernamePasswordAuthenticationFilter filter =
new UsernamePasswordAuthenticationFilter();
filter.setRememberMeServices(rememberMeServices());
filter.setAuthenticationManager(authenticationManagerBean());
return filter;
}
@Bean
public OWAuthenticationManager authenticationManagerBean(){
return new OWAuthenticationManager();
}
@Bean
RememberMeAuthenticationFilter rememberMeFilter() {
RememberMeAuthenticationFilter rememberMeFilter = new RememberMeAuthenticationFilter(authenticationManagerBean(),rememberMeServices());
// rememberMeFilter.setRememberMeServices(rememberMeServices());
// rememberMeFilter.setAuthenticationManager(theAuthenticationManager);
return rememberMeFilter;
}
@Bean
public UserService userDetailService(){
return new UserService();
}
@Bean
PersistentTokenBasedRememberMeServices rememberMeServices() {
PersistentTokenBasedRememberMeServices rememberMeServices = new PersistentTokenBasedRememberMeServices(getKey(), userDetailService(), persistentTokenRepository());
// rememberMeServices.setUserDetailsService(myUserDetailsService);
// rememberMeServices.setKey("springRocks");
return rememberMeServices;
}
@Bean
RememberMeAuthenticationProvider rememberMeAuthenticationProvider() {
RememberMeAuthenticationProvider rememberMeAuthenticationProvider = new RememberMeAuthenticationProvider(getKey());
return rememberMeAuthenticationProvider;
}
@Bean
public String getKey(){
return "NotMyRealKey:P:P";
}
@Autowired private Environment env;
@Bean(name = "persistentTokenRepository")
public PersistentTokenRepository persistentTokenRepository() {
JdbcTokenRepositoryImpl tokenRepository = new JdbcTokenRepositoryImpl();
tokenRepository.setDataSource(dataSource());
return tokenRepository;
}
@Bean
public DataSource dataSource() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName(env.getProperty("mysql.driver"));
dataSource.setUrl(env.getProperty("spring.datasource.url"));
dataSource.setUsername(env.getProperty("spring.datasource.username"));
dataSource.setPassword(env.getProperty("spring.datasource.password"));
return dataSource;
}
@Bean
public static PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
Код: Выделить всё
public class ServletInitializer extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(OfiwebApplication.class);
}
}
Код: Выделить всё
@Component
public class UserService implements UserDetailsService{
@Autowired
private UserRepository repository;
@Autowired
private PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
//search username in database
User byUsername = repository.findByUsername(username);
if (byUsername == null || !byUsername.isBlocked())
throw new UsernameNotFoundException("USer not found: "+username);
GrantedAuthority authority = new SimpleGrantedAuthority(byUsername.getRole().name());
Set authorities = new HashSet();
boolean add = authorities.add(authority);
return new org.springframework.security.core.userdetails.User(
byUsername.getUsername(),
byUsername.getPassword(),
authorities
);
}
}
Код: Выделить всё
public class OWAuthenticationManager implements AuthenticationManager {
@Autowired
private UserRepository repository;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String username = authentication.getPrincipal() + "";
String password = authentication.getCredentials() + "";
User user = repository.findByUsername(username);
if (user == null) {
throw new BadCredentialsException("1000");
}
if (!passwordEncoder().matches(password, user.getPassword())) {
throw new BadCredentialsException("1000");
}
if (user.isBlocked()) {
throw new DisabledException("1001");
}
List userRights = new LinkedList();
userRights.add(user.getRole());
return new UsernamePasswordAuthenticationToken(username, null, userRights.stream().map(x -> new SimpleGrantedAuthority(x.getName())).collect(Collectors.toList()));
}
@Bean
public static PasswordEncoder passwordEncoder(){
return new BCryptPasswordEncoder();
}
}
Код: Выделить всё
#DEV Server
spring.datasource.url=jdbc:mysql://localhost:3306/mydb
mysql.driver=com.mysql.cj.jdbc.Driver
server.port=8025
spring.datasource.username=user
spring.datasource.password=pass
spring.jpa.generate-ddl=true
spring.jpa.hibernate.ddl-auto=update
spring.mvc.view.prefix=/WEB-INF/jsp/
spring.mvc.view.suffix=.jsp
logging.level.org.springframework.security=DEBUG
server.servlet.session.persistent=true
server.error.whitelabel.enabled=false
server.error.path=/error
Код: Выделить всё
Inicio de Sesion
[i]
Recordarme en este equipo
[/i]Iniciar Sesion
Si no tienes una cuenta, contacta a los administradores para que te faciliten una.
Код: Выделить всё
@GetMapping("/login")
public String login(ServletRequest request, Model model){
Map paramMap = request.getParameterMap();
if (paramMap.containsKey("error"))
{
model.addAttribute("loginError", "Usuario o Clave incorrecta. Intenta nuevamente.");
}
return "login-ow";
}
Заранее спасибо.
Пока я пробовал следующее:< /p>
- Использование Redis для кэширования сеанса
- Использование тайм-аута сеанса Http для файлов свойств
< li>Проверка, требуется ли какое-либо разрешение со стороны браузера.
Подробнее здесь: https://stackoverflow.com/questions/786 ... ting-token
Мобильная версия