Пытаюсь разобраться как реаизовать авторизацию, получилось сдлеать, но только работает до перезапуска браузера.
Искал в гугле примеры реализации авторизации для клиента на отдельном сервер, но везде одни и теже стати с JSP в итоге решил попробовать адоптировать один из них под себя и реализовал следующие классы
UserDetailsService
, AuthenticationManager
и класс для авторизации AuthenticateService
. ПОтом я решил доваить функцию rememberm-me, добавил настройки в конфиг, в базе добавилась таблица, но при авторизации не добавляется cookie и запись в базу. Может быть при использовании rememberm-me нужно использвать не UsernamePasswordAuthenticationToken
или добавить какойто фильтр?
Так хотелось бы узнать какие именно интерфейсы\классы нужно использовать для авторизации через токены.
@Component
public class CustomUserDetails implements UserDetailsService {
@Autowired
private UserRepo userRepo;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
EntityUser user = userRepo.findByUsername(username);
List<GrantedAuthority> grantedAuthorities =new ArrayList<>();
for (EntityRole entityRole : user.getRoles()) {
grantedAuthorities.add(new SimpleGrantedAuthority(entityRole.getRoleName()));
}
return new User(user.getUsername(),user.getPassword(),grantedAuthorities);
}
}
@Component
public class CustomAuthentivationManager implements AuthenticationManager {
@Autowired
private UserRepo userRepo;
@Autowired
private CustomUserDetails customUserDetails;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
UserDetails userDetails = (UserDetails) authentication.getPrincipal();
if (userDetails.getPassword().equals(authentication.getPrincipal())){
authentication.setAuthenticated(true);
}
return authentication;
}
}
@Service
public class AuthenticateService implements IAuthentivateService {
@Autowired
private CustomAuthentivationManager authenticationManager;
@Autowired
private CustomUserDetails customUserDetails;
@Override
public String findLigInUsername() {
Object userDetails = SecurityContextHolder.getContext().getAuthentication().getDetails();
if (userDetails instanceof UserDetails){
return ((UserDetails) userDetails).getUsername();
}
return null;
}
@Override
public boolean autologin(String username, String password) {
UserDetails userDetails = customUserDetails.loadUserByUsername(username);
UsernamePasswordAuthenticationToken token
= new UsernamePasswordAuthenticationToken(userDetails,password,userDetails.getAuthorities());
authenticationManager.authenticate(token);
if (token.isAuthenticated()){
SecurityContextHolder.getContext().setAuthentication(token);
return true;
}
return false;
}
}
Теперь cookie отправляется на клиент и в базе токен тоже сохранятеся.
Сделал следующим образом:
1)Наследуемся от PersistentTokenBasedRememberMeServices
переопределяем метод onLoginSuccess
и делаем его публичным.
2)создаем бин класса из п.1
3)В контроллере к параметрам метода который замапин к URL страницы логина добовляем HttpServletRequest request, HttpServletResponse response
, например
@RequestMapping(value = "/api/login", method = RequestMethod.POST, produces = {APPLICATION_JSON_VALUE, APPLICATION_XML_VALUE})
public void postLogin(@RequestBody EntityUser body, HttpServletRequest request, HttpServletResponse response) {
UserDetails userDetails = detailsService.loadUserByUsername(username);
UsernamePasswordAuthenticationToken token =
new UsernamePasswordAuthenticationToken(username,user.getPassword(),userDetails.getAuthorities());
myTokenRememberMeService.onLoginSuccess(req,res,token);
if (token.isAuthenticated())
SecurityContextHolder.getContext().setAuthentication(token);
}
4)создаем токен UsernamePasswordAuthenticationToken
заполняем и вызываем метод onLoginSuccess
передав одним из параметров созданый токен, проверяем что аутентификация прошла и добавляем токен в security context.
P.S. У меня такое чуство что это жесткий костыль и можно сделать все гораздо проще, а пока работает и ладно))
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Учусь на курсах програмированияУ меня есть два идентичных активити
Есть класс, который наследуется от Service, этот класс вызывает уведомление
много раз пользовался fotorama, но дошло дело до того, чтобы вынести стрелки управления за пределы контейнера и все - срабатывает overflow:hidden, а без...
Как это влияет на работу сайта и индексацию в поисковых системах?