Прежде чем пытаться выяснить, почему доступ запрещен на странице, UsernamePasswordAuthenticationToken с конструктором из 3 аргументов всегда устанавливает флаг аутентификации в значение true.
UsernamePasswordAuthenticationToken token=new UsernamePasswordAuthenticationToken(
userDetails,password,userDetails.getAuthorities());
, поэтому проверяется, будет ли аутентифицированный результат истинным, а не реальным статусом на основе аутентификации, так как вы полагаетесь на if(result){...}
:
boolean result = token.isAuthenticated();<- always true
, так как при попытке аутентификации токен authenticationManager.authenticate(token);
здесь должен представлять объект аутентификации, построенный из учетных данных пользователя, например:
UsernamePasswordAuthenticationToken token=new UsernamePasswordAuthenticationToken(enteredUserName,enteredPassword);
, который передается диспетчеру аутентификации, который, в свою очередь, делегирует зарегистрированным провайдерам аутентификации для аутентификации. Я думаю, что ваш SecurityServiceImpl имитирует логин провайдера аутентификации c. Я бы предложил перенести этот лог c в реализацию AuthenticationProvider и зарегистрировать его в AuthenticationManagerBuilder. Basi c пример:
@Component
public class AuthProvider implements AuthenticationProvider {
@Autowired
UserDetailsService userDetailsService;
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
String enteredUserName = authentication.getName();
String enteredPassword = authentication.getCredentials().toString();
UserDetails ud = userDetailsService.loadUserByUsername(userName);
// compare/check password
// if password valid
return new UsernamePasswordAuthenticationToken(ud,null,authorities);
}
@Override
public boolean supports(Class<?> aClass) {
return UsernamePasswordAuthenticationToken.class.isAssignableFrom(aClass);
}
}