Пользовательский токен сохранения базы данных «Запомнить меня», не сохраняющийся токенJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Пользовательский токен сохранения базы данных «Запомнить меня», не сохраняющийся токен

Сообщение Anonymous »

Я создал веб-приложение с весенней загрузкой, используя JSP и безопасность Spring, и пока все работает нормально. Однако я разработал это для своей матери, и мне нужно, чтобы этот сайт никогда не выходил из системы (или, по крайней мере, срок сеанса истекал через год), чтобы ей было удобнее. Проблема заключалась в том, что каждый раз, когда она закрывала сеанс браузера (Chrome), он перезапускался.
Я проверял вчера вечером и обнаружил, что могу создать токен, когда мама входит в систему, и сохранить его в базе данных. поэтому я провел всю ночь, пытаясь заставить 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»