Spring security авторизация пользователя

799
08 января 2017, 16:52

Пытаюсь разобраться как реаизовать авторизацию, получилось сдлеать, но только работает до перезапуска браузера.

Искал в гугле примеры реализации авторизации для клиента на отдельном сервер, но везде одни и теже стати с 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;
    }
}
Answer 1

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

READ ALSO
Два активити используют один метод, как сделать его отдельно?

Два активити используют один метод, как сделать его отдельно?

Учусь на курсах програмированияУ меня есть два идентичных активити

471
Как работать с AlarmManager?

Как работать с AlarmManager?

Есть класс, который наследуется от Service, этот класс вызывает уведомление

540
стрелки в fotorama

стрелки в fotorama

много раз пользовался fotorama, но дошло дело до того, чтобы вынести стрелки управления за пределы контейнера и все - срабатывает overflow:hidden, а без...

638
Плохо ли скрывать html элементы при помощи display: none;? [требует правки]

Плохо ли скрывать html элементы при помощи display: none;? [требует правки]

Как это влияет на работу сайта и индексацию в поисковых системах?

384