Я исследовал сеть довольно много, но все еще не могу найти решение моей проблемы. Повсюду люди используют вещи, которые не подходят моему делу. Мой scenerio:Весна безопасности - значения считывания от контроллера
пользователь отправляет сообщение {email: "admin", password: "admin"}, тогда есть контроллер входа, который проверяет правильность ввода и после того, как этот токен возвращается в заголовке/теле.
Я застрял в той части, где передаю значения от контроллера к проверке подлинности Spring.
Ниже мой конфиг:
@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, securedEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Autowired
private TokenAuthenticationProvider tokenAuthenticationProvider;
@Autowired
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.authenticationProvider(this.tokenAuthenticationProvider);
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/login").permitAll()
.anyRequest().authenticated().and()
.csrf().disable();
}
}
вот мой контроллер:
@RestController
public class LoginController {
@Autowired
private AuthenticationManager authenticationManager;
@RequestMapping(value = "/login", method = RequestMethod.POST)
public ResponseEntity<?> login(@RequestBody LoginCredentials payload){
Authentication authentication = this.authenticationManager.authenticate(
new UsernamePasswordAuthenticationToken(
payload.getUsername(),
payload.getPassword()
)
);
SecurityContextHolder.getContext().setAuthentication(authentication);
return ResponseEntity.ok("OK");
}
}
и это мой провайдер аутентификации
@Component
public class TokenAuthenticationProvider implements AuthenticationProvider {
@Override
public Authentication authenticate(Authentication authentication) throws AuthenticationException {
if(authentication.getName().equals("admin") && authentication.getCredentials().equals("admin")) {
List<GrantedAuthority> grantedAuths = new ArrayList<>();
grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
grantedAuths.add(new SimpleGrantedAuthority("ROLE_ADMIN"));
return new UsernamePasswordAuthenticationToken(authentication.getName(), authentication.getCredentials(), grantedAuths);
} else {
return null;
}
}
@Override
public boolean supports(Class<? extends Object> authentication) {
return (UsernamePasswordAuthenticationToken.class.isAssignableFrom(authentication));
}
}
Im делает запрос пост с учетными данными, и это ответ Im получение:
{
"timestamp": 1486995388844,
"status": 403,
"error": "Forbidden",
"exception": "org.springframework.security.authentication.ProviderNotFoundException",
"message": "Access Denied",
"path": "/login"
}
Вместо взлома Spring Security используйте фреймворк, как он предназначен. Создайте фильтр для аутентификации, не пытайтесь подключить его к контроллеру и надейтесь, что Spring Security сделает то, что он –
@ M.Deinum. Вам нужно обработать входящие учетные данные в фильтре, создать не прошедшую проверку подлинности аутентификацию, которая затем обрабатывается AuthenticationManager, которая разрешает роли и создает авторизацию zed Аутентификация и возвращает токен. При последующих запросах токен разрешается против вашего TokenStore (db) внутри другого фильтра, и вы создаете авторизованную аутентификацию (если токен действителен) и устанавливаете 'SecurityContextHolder.getContext(). SetAuthentication' (как и Spring security в BasicAuthenticationFilter). –
ok Итак, мне нужно 2 фильтра, один проверяет правильность ввода логина (имя пользователя, пароль), и если да, то выдаёт действительный токен (который может быть сохранен в db или просто JWT), а затем я должен написать другой фильтр, который проверяет запросы с прикрепленным токеном? – filemonczyk