Я пытаюсь создать провайдера oAuth2.
В настоящее время для этого должны использоваться некоторые жестко запрограммированные пользователи, но цель состоит в том, чтобы привязать их к существующим серверам LDAP.
Я использую загрузочный фреймворк Spring.
Это моя точка входа:
@SpringBootApplication
public class OauthserverApplication {
public static void main(String[] args) {
SpringApplication.run(OauthserverApplication.class, args);
}
}
Это мой контроллер:
@RestController
@RequestMapping("clients")
public class CustomOAuth2Controller {
@Autowired private ClientDetailsRepository clientDetailsRepository;
@GetMapping
public List<CustomClientDetails> getAll(){
List<CustomClientDetails> l = new ArrayList<>();
for(CustomClientDetails ccd : this.clientDetailsRepository.findAll())
l.add(ccd);
return l;
}
@PostMapping
public String addClient(@RequestBody CustomClientDetails customClientDetails){
this.clientDetailsRepository.save(customClientDetails);
return "Added Successfully";
}
@DeleteMapping
public String removeClient(@RequestParam("clientid") String clientid){
try {
Long l = Long.parseLong(clientid);
this.clientDetailsRepository.deleteById(l);
}catch (Exception ex){}
return "Deleted";
}
}
Хранилище с моими пользовательскими данными довольно стандартно:
@Repository
public interface ClientDetailsRepository extends
CrudRepository<CustomClientDetails,Long> {
}
Класс для настройки oAuth
@Configuration
@EnableAuthorizationServer
public class OAuth2Config extends AuthorizationServerConfigurerAdapter {
@Autowired private final AuthenticationManager authenticationManager;
@Autowired private ClientDetailsRepository clientDetailsRepository;
@Autowired
public OAuth2Config(AuthenticationConfiguration authenticationConfiguration) throws Exception {
this.authenticationManager = authenticationConfiguration.getAuthenticationManager();
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.withClientDetails( identifier -> {
System.out.println(" client id from ui "+identifier);
return clientDetailsRepository.findById(Long.parseLong(identifier)).get();
});
}
@Override
public void configure(AuthorizationServerSecurityConfigurer oauthServer) throws Exception {
oauthServer
.tokenKeyAccess("permitAll()")
.checkTokenAccess("isAuthenticated()")
.passwordEncoder(NoOpPasswordEncoder.getInstance());
}
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.authenticationManager(authenticationManager);
}
}
И мой логин:
@Configuration
@EnableWebSecurity
@Order(1)
public class LoginConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.anyRequest()
.authenticated()
.and()
.formLogin()
.and()
.httpBasic();
}
@Override
@Bean
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication().withUser(User.withDefaultPasswordEncoder().username("user").password("user").roles("USER").build());
}
}
В своем клиентском приложении я использую следующие учетные данные:
server:
port: 9090
security:
oauth2:
client:
client-id: acme
client-secret: acmesecret
scope: read,write
auto-approve-scopes: '.*'
accessTokenUri: http://localhost:8010/login/oauth/access_token
userAuthorizationUri: http://localhost:8010/login/oauth/authorize
clientAuthenticationScheme: form
resource:
userInfoUri: http://localhost:8010/user
и следующий конфиг:
@SpringBootApplication
@EnableOAuth2Sso
@RestController
public class SpringBootOauth2Application extends WebSecurityConfigurerAdapter {
public static void main(String[] args) {
SpringApplication.run(SpringBootOauth2Application.class, args);
}
@RequestMapping({ "/user", "/me" })
public Map<String, String> user(Principal principal) {
Map<String, String> map = new LinkedHashMap<>();
map.put("name", principal.getName());
return map;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.antMatcher("/**")
.authorizeRequests()
.antMatchers("/", "/login**", "/webjars/**", "/error**")
.permitAll()
.anyRequest()
.authenticated()
.and().logout().logoutSuccessUrl("/").permitAll()
.and().csrf().csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse());
}
}
Это частично работает.
Я могу выбрать «логин», и он перенаправляет меня на страницу входа в мой провайдер oAuth. Но как только я ввожу учетные данные и подтверждаю, он выдает 404.