Пытаюсь разобраться как реаизовать авторизацию, получилось сдлеать, но только работает до перезапуска браузера.
Искал в гугле примеры реализации авторизации для клиента на отдельном сервер, но везде одни и теже стати с 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. У меня такое чуство что это жесткий костыль и можно сделать все гораздо проще, а пока работает и ладно))
Сборка персонального компьютера от Artline: умный выбор для современных пользователей