Извините мой английский.
У меня есть приложение, в которое я могу войти обычным способом.
@Configuration
@EnableWebSecurity
public class LoginSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
System.out.println("LoginSecurityConfig :: configure");
auth.jdbcAuthentication().dataSource( getDataSource() )
.passwordEncoder( new BCryptPasswordEncoder(16) )
.usersByUsernameQuery(
"select user_name as username,password,enabled from users where user_name=?")
.authoritiesByUsernameQuery(
"select user_name as username, role_name from users_roles ur join users u on ur.user_id = u.user_id and u.user_name = ?");
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.csrf().disable()
.authorizeRequests()
.antMatchers("/login*").anonymous()
.antMatchers("/resources/**").permitAll()
.antMatchers("/fotos/**").permitAll()
.antMatchers("/users").access("hasRole('ROLE_ADMIN')")
.antMatchers("/user").access("hasRole('ROLE_ADMIN')")
.anyRequest().authenticated()
.and()
.formLogin()
.loginPage("/loginPage")
.defaultSuccessUrl("/home", true)
.failureUrl("/loginPage?error=true")
.loginProcessingUrl("/login")
.usernameParameter("username")
.passwordParameter("password")
.and()
.logout()
.logoutSuccessUrl("/loginPage")
.invalidateHttpSession(true);
}
}
Используя это, я могу попытаться получить доступ к любому защищенному ресурсу, и система отправляет меня в loginPage
, где я могу отправить username
и password
на внутренний контроллер login
, после чего у меня есть Principal
и я могу получить доступ к защищенным ресурсам (дом, пользователи, пользователь). Работает нормально.
Но... Мне нужно удалить содержимое базы данных управления пользователями и использовать OAuth2, чтобы разрешить такой же доступ. Я больше не хочу иметь пользователей в своей базе данных. Мне нужен экран входа в систему, а затем запрос токена, например http://myserver/oauth/token?grant_type=password&username=admin&password=admin
, передающий client_id
и client_secret
в Basic
. Я знаю, как выполнить часть «получить токен», и мой сервер работает нормально и дает мне токен и токен обновления, но только с помощью Postman, потому что я понятия не имею, как использовать его в коде моего веб-приложения. Все учебники, которые я нашел, используют как сервер, так и клиент в одном приложении и фактически не показывают, как использовать удаленный сервер OAuth2.
Уже пытались использовать это. Это отличный учебник и очень близок к тому, что мне нужно, но слишком сложен для меня.
У меня есть этот код, и я понимаю, что он может использовать сервер и выдавать токен, используя учетные данные клиента, но не знаю, как предоставить пользователю экран входа в систему и использовать его учетные данные для выполнения запроса (часть GET
).
@Configuration
@EnableResourceServer
public class OAuth2ResourceServerConfigRemoteTokenService extends ResourceServerConfigurerAdapter {
@Override
public void configure(final HttpSecurity http) throws Exception {
http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED)
.and()
.authorizeRequests().anyRequest().permitAll();
}
@Primary
@Bean
public RemoteTokenServices tokenServices() {
final RemoteTokenServices tokenService = new RemoteTokenServices();
tokenService.setCheckTokenEndpointUrl("http://myoauthserver/oauth/check_token");
tokenService.setClientId("clientid");
tokenService.setClientSecret("password");
return tokenService;
}
}
Итак ... как я могу защитить свою систему, получить логин и пароль от пользователя и использовать этот код для управления учетными данными, как я использовал обычный метод базы данных?
Или OAuth2 предназначен только для безопасного REST API?
Пожалуйста, будьте дружелюбны к новичкам, потому что мне не очень удобно использовать Spring.