Spring Security Oauth 2 예시
13176 단어 자바
pom.xml
org.springframework.boot
spring-boot-starter-web
org.springframework.boot
spring-boot-starter-security
org.springframework.security.oauth
spring-security-oauth2
org.springframework.security
spring-security-jwt
1. 리 소스 서버 (자원 서버)
application.yml
server:
port: 8082
context-path: /resourceserver
시작 클래스
@SpringBootApplication
public class ResourceServerApplication {
public static void main(String[] args) {
SpringApplication.run(ResourceServerApplication.class, args);
}
}
TestController. java (RESTful 인터페이스 노출)
@RestController
public class TestController {
@GetMapping("/product/{id}")
public String product(@PathVariable String id) {
return "product id : " + id;
}
@GetMapping("/order/{id}")
public String order(@PathVariable String id) {
return "order id : " + id;
}
@GetMapping("/pomer/{id}")
public String pomer(@PathVariable String id) {
return "pomer id : " + id;
}
}
클래스 ResourceServerConfig 설정 (JWT 형식의 token 설정)
@EnableResourceServer
@Configuration
public class ResourceServerConfig {
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(jwtAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("123");
return converter;
}
}
클래스 MyResourceServerConfigurer 설정 (접근 권한 설정)
@Configuration
public class MyResourceServerConfigurer extends ResourceServerConfigurerAdapter {
@Override
public void configure(HttpSecurity http) throws Exception {
http
.authorizeRequests()
.antMatchers("/product/**").permitAll()
.antMatchers("/order/**").authenticated()
.antMatchers("/pomer/**").access("#oauth2.hasScope('read_profile') and hasAuthority('ADMIN')");
}
}
2. AuthorizationServer 권한 수여 서버 (권한 수여 코드 모드, 권한 부여 코드)
application.yml
server:
port: 8081
context-path: /authorizationserver
시작 클래스
@SpringBootApplication
public class AuthorizationServerApplication {
public static void main(String[] args) {
SpringApplication.run(AuthorizationServerApplication.class, args);
}
}
클래스 AuthorizationServerConfig 설정 (JWT 형식의 token 설정)
@EnableAuthorizationServer
@Configuration
public class AuthorizationServerConfig {
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(jwtAccessTokenConverter());
}
@Bean
public JwtAccessTokenConverter jwtAccessTokenConverter() {
JwtAccessTokenConverter converter = new JwtAccessTokenConverter();
converter.setSigningKey("123");
return converter;
}
}
설정 클래스 MyAuthorizationServer Configurer
@Configuration
public class MyAuthorizationServerConfigurer extends AuthorizationServerConfigurerAdapter {
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private TokenStore tokenStore;
@Autowired
private JwtAccessTokenConverter jwtAccessTokenConverter;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints.tokenStore(tokenStore)
.accessTokenConverter(jwtAccessTokenConverter)
.authenticationManager(authenticationManager);
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientApp")
.secret("123456")
.redirectUris("http://localhost:9000/callback")
.authorizedGrantTypes("authorization_code")
.scopes("read_profile", "read_contacts");
}
}
클래스 MyWebSecurity ConfigurerAdapter 설정 (사용자 이름 비밀번호 설정)
@Configuration
public class MyWebSecurityConfigurerAdapter extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
auth.inMemoryAuthentication()
.withUser("user").password("123456").authorities("USER").and()
.withUser("admin").password("123456").authorities("USER", "ADMIN");
}
}
테스트 시작!브 라 우 저 접근 열기:
http://localhost:8081/authorizationserver/oauth/authorize?client_id=clientApp&redirect_uri=http://localhost:9000/callback&response_type=code&scope=read_profile
로그 인 페이지 를 표시 하고 사용자 이름 비밀 번 호 를 입력 하 며 302 로 되 돌아 갑 니 다 (인증 코드 는 매개 변수 부분 에 있 습 니 다)
http://localhost:9000/callback?code=EWfpi5
인증 코드 에 따라 토 큰 요청:
> curl -X POST --user clientApp:123456 http://localhost:8081/authorizationserver/oauth/token -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=authorization_code&redirect_uri=http://localhost:9000/callback&scope=read_profile&code=EWfpi5"
# clientApp:123456 Base64 'Y2xpZW50QXBwOjEyMzQ1Ng=='
POST /authorizationserver/oauth/token HTTP/1.1
Host: localhost:8081
Content-Type: application/x-www-form-urlencoded
Authorization: Basic Y2xpZW50QXBwOjEyMzQ1Ng==
Cache-Control: no-cache
Postman-Token: c6c182c7-5df1-46ea-9cb7-130ff250c93c
code=F4QesT&grant_type=authorization_code&redirect_uri=http%3A%2F%2Flocalhost%3A9000%2Fcallback&scope=read_profile
영패 획득:
{
"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDE4NTExMTYsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJVU0VSIl0sImp0aSI6ImMyYzQ4YTc0LWI4MjUtNGNlYS05NGU3LTMyM2VlN2Q4NTk2ZCIsImNsaWVudF9pZCI6ImNsaWVudEFwcCIsInNjb3BlIjpbInJlYWRfcHJvZmlsZSJdfQ.Oc1TN7fMPgNVXX7k8dEw0QqosD7ZKQ198c-Qa2l1Gho",
"token_type":"bearer",
"expires_in":43199,
"scope":"read_profile",
"jti":"c2c48a74-b825-4cea-94e7-323ee7d8596d"
}
토 큰 요청 자원
> curl http://localhost:8082/resourceserver/order/12 -H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDE4NTExMTYsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJVU0VSIl0sImp0aSI6ImMyYzQ4YTc0LWI4MjUtNGNlYS05NGU3LTMyM2VlN2Q4NTk2ZCIsImNsaWVudF9pZCI6ImNsaWVudEFwcCIsInNjb3BlIjpbInJlYWRfcHJvZmlsZSJdfQ.Oc1TN7fMPgNVXX7k8dEw0QqosD7ZKQ198c-Qa2l1Gho"
GET /resourceserver/order/12 HTTP/1.1
Host: localhost:8082
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDE4NTExMTYsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJVU0VSIl0sImp0aSI6ImMyYzQ4YTc0LWI4MjUtNGNlYS05NGU3LTMyM2VlN2Q4NTk2ZCIsImNsaWVudF9pZCI6ImNsaWVudEFwcCIsInNjb3BlIjpbInJlYWRfcHJvZmlsZSJdfQ.Oc1TN7fMPgNVXX7k8dEw0QqosD7ZKQ198c-Qa2l1Gho
Cache-Control: no-cache
Postman-Token: 913a8844-1308-47d8-afa3-a9f288323c20
자원 되 돌리 기
order id : 12
첨부: / produt / * 누구나 접근 할 수 있 습 니 다. / order / * 는 사용자 인증 이 필요 합 니 다. / pomer / * 는 ADMIN 권한 을 가 진 admin 사용자 만 접근 할 수 있 습 니 다. 테스트 유효 합 니 다.
3. AuthorizationServer 권한 수여 서버 (간소화 모드, implicit)
설정 클래스 만 변경 MyAuthorizationServer Configurer, 나머지 코드 는 변 하지 않 습 니 다.
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientApp")
.secret("123456")
.redirectUris("http://localhost:9000/callback")
.authorizedGrantTypes("implicit")
.scopes("read_profile","read_contacts");
}
테스트 시작!브 라 우 저 접근 열기:
http://localhost:8081/authorizationserver/oauth/authorize?client_id=clientApp&redirect_uri=http://localhost:9000/callback&response_type=token&scope=read_profile&state=xyz
로그 인 페이지 를 표시 하고 사용자 이름 비밀 번 호 를 입력 하 며 302 로 되 돌아 갑 니 다 (토 큰 은 hash 부분 에 있 습 니 다).
http://localhost:9000/callback#access_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDE4NjMxNjMsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJVU0VSIl0sImp0aSI6ImQ2MzYxYzZjLTIyZWYtNDU2ZC1iOGJhLWY4ZTE5MzMwMTBmOSIsImNsaWVudF9pZCI6ImNsaWVudEFwcCIsInNjb3BlIjpbInJlYWRfcHJvZmlsZSJdfQ.BRwtzF2rFc6w8WECqYETZbkCSDdoOzKdF4Zm_SAZuao&token_type=bearer&state=xyz&expires_in=119&jti=d6361c6c-22ef-456d-b8ba-f8e1933010f9
토 큰 을 받 으 면 후속 요청 자원 이 같 습 니 다. 더 이상 반복 하지 않 습 니 다.
4. AuthorizationServer 인증 서버 (암호 모드, 리 소스 소유자 암호 자격 증명)
설정 클래스 변경 MyAuthorizationServer Configurer
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientApp")
.secret("123456")
.authorizedGrantTypes("password")
.scopes("read_profile", "read_contacts");
}
기본적으로 AuthorizationServerEndpoints Configure 설정 은 암호 모드 를 열지 않 았 습 니 다. authenticationManager 를 설정 해 야 암호 모드 를 열 수 있 습 니 다. 다음 과 같 습 니 다.
MyWebSecurity ConfigurerAdapter. java 에 코드 추가 (authenticationManager Bean 설정)
@Bean
@Override
public AuthenticationManager authenticationManagerBean() throws Exception {
return super.authenticationManagerBean();
}
MyAuthorizationServerConfigure. java 에 코드 를 추가 합 니 다 (AuthorizationServerEndpoints Configure 에 authenticationManager 설정)
@Autowired
private AuthenticationManager authenticationManager;
@Autowired
private TokenStore tokenStore;
@Autowired
private JwtAccessTokenConverter jwtAccessTokenConverter;
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) {
endpoints.tokenStore(tokenStore)
.accessTokenConverter(jwtAccessTokenConverter)
.authenticationManager(authenticationManager);
}
테스트 시작!요청 영패
> curl -X POST --user clientApp:123456 http://localhost:8081/authorizationserver/oauth/token -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=password&scope=read_profile&username=user&password=123456"
영패 획득:
{
"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJleHAiOjE1NDE5MDk4MTcsInVzZXJfbmFtZSI6InVzZXIiLCJhdXRob3JpdGllcyI6WyJVU0VSIl0sImp0aSI6ImJhZDk1OTI0LTdkYTgtNDUyMy05YzZkLTBkNzY3NTlmYjQ1NiIsImNsaWVudF9pZCI6ImNsaWVudEFwcCIsInNjb3BlIjpbInJlYWRfcHJvZmlsZSJdfQ.gO5_kl8_OBRnj2Dt5glflXAIJrbyioYXezV-ZQ8BxL4",
"token_type":"bearer",
"expires_in":43199,
"scope":"read_profile",
"jti":"bad95924-7da8-4523-9c6d-0d76759fb456"
}
토 큰 을 받 으 면 후속 요청 자원 이 같 습 니 다. 더 이상 반복 하지 않 습 니 다.
5. AuthorizationServer 권한 수여 서버 (클 라 이언 트 모드, client credentials)
설정 클래스 만 변경 MyAuthorizationServer Configurer, 나머지 코드 는 변 하지 않 습 니 다.
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
clients.inMemory()
.withClient("clientApp")
.secret("123456")
.authorizedGrantTypes("client_credentials")
.scopes("read_profile", "read_contacts");
}
테스트 시작!요청 영패
> curl -X POST --user clientApp:123456 http://localhost:8081/authorizationserver/oauth/token -H "Content-Type: application/x-www-form-urlencoded" -d "grant_type=client_credentials&scope=read_profile"
영패 획득:
{
"access_token":"eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzY29wZSI6WyJyZWFkX3Byb2ZpbGUiXSwiZXhwIjoxNTQxOTEwOTEzLCJqdGkiOiI5MDVjNzc2OS1lNGQ2LTQxYTItYjcyMC1jYzliZWZjYzE5MDQiLCJjbGllbnRfaWQiOiJjbGllbnRBcHAifQ.c6UiHxbCdioCklkCqkLsCG6C8KHwwzajlPka6ut5MJs",
"token_type":"bearer",
"expires_in":43199,
"scope":"read_profile",
"jti":"905c7769-e4d6-41a2-b720-cc9befcc1904"
}
토 큰 을 받 으 면 후속 요청 자원 이 같 습 니 다. 더 이상 반복 하지 않 습 니 다.
다음으로 전송:https://www.cnblogs.com/pomer-huang/p/pomer_huang.html
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Is Eclipse IDE dying?In 2014 the Eclipse IDE is the leading development environment for Java with a market share of approximately 65%. but ac...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.