BAEL-5335: Introduction to OAuth2RestTemplate (#11849)
This commit is contained in:
parent
7c3cbf0d4f
commit
3687b7bc64
@ -0,0 +1,32 @@
|
|||||||
|
package com.baeldung.oauth2resttemplate;
|
||||||
|
|
||||||
|
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
|
||||||
|
import org.springframework.stereotype.Controller;
|
||||||
|
import org.springframework.ui.Model;
|
||||||
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
||||||
|
import java.security.Principal;
|
||||||
|
import java.util.Collection;
|
||||||
|
|
||||||
|
@Controller
|
||||||
|
public class AppController {
|
||||||
|
|
||||||
|
OAuth2RestTemplate restTemplate;
|
||||||
|
|
||||||
|
public AppController(OAuth2RestTemplate restTemplate) {
|
||||||
|
this.restTemplate = restTemplate;
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/home")
|
||||||
|
public String welcome(Model model, Principal principal) {
|
||||||
|
model.addAttribute("name", principal.getName());
|
||||||
|
return "home";
|
||||||
|
}
|
||||||
|
|
||||||
|
@GetMapping("/repos")
|
||||||
|
public String repos(Model model) {
|
||||||
|
Collection<GithubRepo> repos = restTemplate.getForObject("https://api.github.com/user/repos", Collection.class);
|
||||||
|
model.addAttribute("repos", repos);
|
||||||
|
return "repositories";
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,22 @@
|
|||||||
|
package com.baeldung.oauth2resttemplate;
|
||||||
|
|
||||||
|
public class GithubRepo {
|
||||||
|
Long id;
|
||||||
|
String name;
|
||||||
|
|
||||||
|
public Long getId() {
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setId(Long id) {
|
||||||
|
this.id = id;
|
||||||
|
}
|
||||||
|
|
||||||
|
public String getName() {
|
||||||
|
return name;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setName(String name) {
|
||||||
|
this.name = name;
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,73 @@
|
|||||||
|
package com.baeldung.oauth2resttemplate;
|
||||||
|
|
||||||
|
import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties;
|
||||||
|
import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices;
|
||||||
|
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||||
|
import org.springframework.boot.web.servlet.FilterRegistrationBean;
|
||||||
|
import org.springframework.context.annotation.Bean;
|
||||||
|
import org.springframework.context.annotation.Configuration;
|
||||||
|
import org.springframework.core.Ordered;
|
||||||
|
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
|
||||||
|
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
|
||||||
|
import org.springframework.security.oauth2.client.OAuth2ClientContext;
|
||||||
|
import org.springframework.security.oauth2.client.OAuth2RestTemplate;
|
||||||
|
import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter;
|
||||||
|
import org.springframework.security.oauth2.client.filter.OAuth2ClientContextFilter;
|
||||||
|
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails;
|
||||||
|
import org.springframework.security.oauth2.config.annotation.web.configuration.EnableOAuth2Client;
|
||||||
|
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
|
||||||
|
|
||||||
|
import javax.servlet.Filter;
|
||||||
|
|
||||||
|
@Configuration
|
||||||
|
@EnableOAuth2Client
|
||||||
|
public class SecurityConfig extends WebSecurityConfigurerAdapter {
|
||||||
|
OAuth2ClientContext oauth2ClientContext;
|
||||||
|
|
||||||
|
public SecurityConfig(OAuth2ClientContext oauth2ClientContext) {
|
||||||
|
this.oauth2ClientContext = oauth2ClientContext;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void configure(HttpSecurity http) throws Exception {
|
||||||
|
http.authorizeRequests().antMatchers("/", "/login**", "/error**")
|
||||||
|
.permitAll().anyRequest().authenticated()
|
||||||
|
.and().logout().logoutUrl("/logout").logoutSuccessUrl("/")
|
||||||
|
.and().addFilterBefore(oauth2ClientFilter(), BasicAuthenticationFilter.class);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public FilterRegistrationBean<OAuth2ClientContextFilter> oauth2ClientFilterRegistration(OAuth2ClientContextFilter filter) {
|
||||||
|
FilterRegistrationBean<OAuth2ClientContextFilter> registration = new FilterRegistrationBean<>();
|
||||||
|
registration.setFilter(filter);
|
||||||
|
registration.setOrder(Ordered.HIGHEST_PRECEDENCE + 1);
|
||||||
|
return registration;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
public OAuth2RestTemplate restTemplate() {
|
||||||
|
return new OAuth2RestTemplate(githubClient(), oauth2ClientContext);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConfigurationProperties("github.client")
|
||||||
|
public AuthorizationCodeResourceDetails githubClient() {
|
||||||
|
return new AuthorizationCodeResourceDetails();
|
||||||
|
}
|
||||||
|
|
||||||
|
private Filter oauth2ClientFilter() {
|
||||||
|
OAuth2ClientAuthenticationProcessingFilter oauth2ClientFilter = new OAuth2ClientAuthenticationProcessingFilter("/login/github");
|
||||||
|
OAuth2RestTemplate restTemplate = restTemplate();
|
||||||
|
oauth2ClientFilter.setRestTemplate(restTemplate);
|
||||||
|
UserInfoTokenServices tokenServices = new UserInfoTokenServices(githubResource().getUserInfoUri(), githubClient().getClientId());
|
||||||
|
tokenServices.setRestTemplate(restTemplate);
|
||||||
|
oauth2ClientFilter.setTokenServices(tokenServices);
|
||||||
|
return oauth2ClientFilter;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Bean
|
||||||
|
@ConfigurationProperties("github.resource")
|
||||||
|
public ResourceServerProperties githubResource() {
|
||||||
|
return new ResourceServerProperties();
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,15 @@
|
|||||||
|
package com.baeldung.oauth2resttemplate;
|
||||||
|
|
||||||
|
import org.springframework.boot.SpringApplication;
|
||||||
|
import org.springframework.boot.autoconfigure.SpringBootApplication;
|
||||||
|
import org.springframework.context.annotation.PropertySource;
|
||||||
|
|
||||||
|
@SpringBootApplication
|
||||||
|
@PropertySource("classpath:application-oauth2-rest-template.properties")
|
||||||
|
public class SpringSecurityOauth2ClientApplication {
|
||||||
|
|
||||||
|
public static void main(String[] args) {
|
||||||
|
SpringApplication.run(SpringSecurityOauth2ClientApplication.class, args);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,9 @@
|
|||||||
|
github.client.clientId=[CLIENT_ID]
|
||||||
|
github.client.clientSecret=[CLIENT_SECRET]
|
||||||
|
github.client.userAuthorizationUri=https://github.com/login/oauth/authorize
|
||||||
|
github.client.accessTokenUri=https://github.com/login/oauth/access_token
|
||||||
|
github.client.clientAuthenticationScheme=form
|
||||||
|
|
||||||
|
github.resource.userInfoUri=https://api.github.com/user
|
||||||
|
|
||||||
|
spring.thymeleaf.prefix=classpath:/templates/oauth2resttemplate/
|
@ -0,0 +1,9 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<title>Error</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>An error occurred.</p>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,18 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>Home</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
Welcome <b th:inline="text"> [[${name}]] </b>
|
||||||
|
</p>
|
||||||
|
<h3>
|
||||||
|
<a href="/repos">View Repositories</a><br/><br/>
|
||||||
|
</h3>
|
||||||
|
|
||||||
|
<form th:action="@{/logout}" method="POST">
|
||||||
|
<input type="submit" value="Logout"/>
|
||||||
|
</form>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,16 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>OAuth2Client</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<h3>
|
||||||
|
<a href="/home" th:href="@{/home}" th:if="${#httpServletRequest?.remoteUser != undefined }">
|
||||||
|
Go to Home
|
||||||
|
</a>
|
||||||
|
<a href="/login/github" th:href="@{/login/github}" th:if="${#httpServletRequest?.remoteUser == undefined }">
|
||||||
|
GitHub Login
|
||||||
|
</a>
|
||||||
|
</h3>
|
||||||
|
</body>
|
||||||
|
</html>
|
@ -0,0 +1,14 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en" xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org">
|
||||||
|
<head>
|
||||||
|
<title>Repositories</title>
|
||||||
|
</head>
|
||||||
|
<body>
|
||||||
|
<p>
|
||||||
|
<h2>Repos</h2>
|
||||||
|
</p>
|
||||||
|
<ul th:each="repo: ${repos}">
|
||||||
|
<li th:text="${repo.name}"></li>
|
||||||
|
</ul>
|
||||||
|
</body>
|
||||||
|
</html>
|
Loading…
x
Reference in New Issue
Block a user