2013-04-23 5 views
8

나는 스프링 보안을 사용하고 사용자 (사용자 이름 & 암호)와 표준 폼 인증을 가진 사이트를 가지고있다. 사용자가 OAuth2 보안 API를 사용하기 위해 계정에 연결된 클라이언트 ID 및 클라이언트 비밀번호를 생성하도록 허용합니다. 스프링 보안 oauth2 - OAuth2 보안 주체로부터 커스텀 데이터 얻기

내가 해제, 특정 범위 설정 등의 API 액세스 내가 사용

를 사용자 이름과 암호를 사용자가 API 자격 증명을 파괴하지 않고 자신의 비밀번호 등을 변경할 수 있도록 API에 대한 별도의 클라이언트 ID & 클라이언트 비밀번호를 사용하지 spring-security-oauth2 (provider)는 나머지 API를 보호하기 위해 클라이언트 인증 정보 흐름을 허용했습니다. 나는 클라이언트 id와 secret가 검사되도록 api에 대한 클라이언트 인증을 설정했다.

별도의 응용 프로그램에서 클라이언트 ID와 클라이언트 비밀 번호를 사용하여 액세스 토큰을 검색하고이를 API와 함께 사용하기 시작합니다. 대부분의 경우 클라이언트 역할과 범위를 기반으로하는 간단한 @PreAuthorize 식을 사용하며 올바르게 작동하는 것으로 보입니다. 위의 모든

내가 기본 사용자로부터 몇 가지 세부 사항을 기반으로 좀 더 복잡한 규칙을 구현하기 위해 필요로하는 곳에 내가 지금 그러나 몇 가지 API 엔드 포인트가 ...

그러나 잘 작동하는 표시 -이 경우 클라이언트 ID와 암호를 생성 한 사용자.

간단한 예로, 사용자가 다를 수있는 특정 유형의 새 "메시지"를 게시 할 수있는 엔드 포인트가있는 메시징 응용 프로그램을 고려해보십시오. 나는 각 사용자와 각 유형에 대해 허용 된 수신자 테이블을 가지고 있으며 게시 된 메시지의 수신자가 해당 유형의 허용 된 수신자와 일치하는지 확인하려고합니다. (사용자가 허용하는 수신자 데이터는 대개 크지 않고 거의 변경되지 않으므로 액세스 토큰을 생성 할 때 복사본을 저장해야합니다.)

나는이 끝점에서 주체를 얻으며 이것이 OAuth2Authentication 포함 :

  • userAuthentication - null - 이것은 클라이언트 자격 증명 흐름에 예상됩니다.
  • clientAuthentication이 채워집니다 및 authorizationParameters가 부여 유형을 포함하고 나는 사용자와 내가 필요한 세부 사항을 조회 할 수 clientAuthentication.authorizationParameters에서 클라이언트 ID를 사용할 수있는 가정

CLIENT_ID하지만 각 몇 쿼리 것 api는 부끄럽지 않습니다.

나는 OAuth2Authentication (Principal) 객체 (또는 그것을 확장하는 것)에서 나중에 얻을 수 있도록 몇 가지 추가 세부 사항을 추가 할 수있는 액세스 토큰을 부여하는 동안 Spring OAuth2 라이브러리에 좋은 장소/방법이 있다고 생각하겠다. ?)

또는 이와 같은 문제에 전적으로 더 나은 접근 방법이 있습니까?

Thx!

+0

사용해야합니까? 그 안에 모든 유용한 정보를 담고있는 토큰입니다. – kaqqao

답변

5

토큰 생성 클래스를 재정 의하여 토큰에 사용자 이름이 포함될 수 있습니다. (아마도 client_secret을 사용하여 암호화 될 수 있습니다). 추가 데이터베이스 액세스없이 토큰 자체에서 토큰과 관련된 사용자를 얻을 수 있습니다. 당신은 당신의 자신의 클래스와

을 무시하거나 JWT (JSON 웹 토큰) 봤어 TokenEnhancer

+0

Thx는 처음에 유망한 것으로 들립니다. 나는 그것을 더 확인하고 다음날에 몇 가지 검사를하겠습니다. 아직 기사/게시물/샘플을 찾지 못했습니다. 알고 계시다면 알려주세요. :) –

+0

안녕하세요, TokenEnhancer가 액세스 토큰 응답을 "향상"하고 /하거나 추가하는 것이 유용하다고 봅니다. 몇 가지 추가 정보. 그건 내가 원하는 것이 아니지만. 추가 데이터를 클라이언트에 다시 보낼 필요가 없습니다. 토큰에 사용자 이름을 채워 넣으려는 생각을 이해하는 동안 (나는 자주 필요하지 않습니다) 나뭇잎 토큰 등을 변경하지 않고 그냥 서버 쪽에서 발생하는 더 나은 방법이 있어야합니다. –

+0

'ClientDetails.addAdditionalInformation'을 사용하여 각 클라이언트를 등록 할 때 클라이언트 정보에 필요한 정보를 추가 할 수 있습니다. 'clientId '를 사용하여이 정보를 검색 할 수 있습니다. (합리적인 요청 당 하나의 쿼리가 필요할 수 있습니다.) – achiash

6

클라이언트 세부 정보에서 정의 할 수있는 Scopes를 사용하지 않는 이유와 ScopeVoter를 사용하여이 토큰이이 리소스에 액세스 할 수 있는지 여부를 확인하는 이유는 무엇입니까?

자세한 내용

https://github.com/bassemZohdy/Spring_REST_OAuth_Demo

업데이트 한 내 데모를 확인하십시오 : 나는 당신의 질문의 2 부에 회신하지 않았다 "OAuth2를 교장에서 사용자 정의 데이터를 가져 오는 것은"당신은 당신의 인증에 나머지 서비스를 추가 할 수 있습니다 서버는 OAuth 토큰을 사용하여 액세스되어이 토큰 사용자에 대한 필수 정보를 제공하므로 인증 서버를 자원 서버로 취급하는 "OAuth2 principal"에 ​​대해 신경 쓸 필요가 없습니다.

+0

Thx, 이미 간단한 스코프를 사용하고 있지만, 내가 원하는 규칙을 달성하기 위해 엄청난 양의 범위에 대해 걱정할 때 그 해결책을 피했습니다. 질문을 예제로 업데이트하겠습니다. –

+0

다른 솔루션에서 범위 그룹을 사용하고 있습니다. 스코프의 범위에 제한이없는 것으로 생각합니다. 또한 범위를 범위와 혼합 할 수 있습니다. –

+0

Thx, 예, 저는 이미 그런 비트를 사용합니다. 필자가 언급 한 사례에서 사용자로부터 스코프를 공식화 한 다음 해석하여 프로세스를 해석하여 더 나은 방법이 있었으면 좋겠다. –

5

내 생각에 올바른 방법은 클라이언트 자격 증명 대신 oauth2 "암호"흐름을 사용하는 것입니다. 일반 클라이언트 ID 및 클라이언트 비밀 키를 생성하여 모든 사용자에게 제공 할 수 있습니다. 각 사용자는 클라이언트 세부 정보와 자신의 사용자 이름 및 암호를 사용하여 자신의 토큰을 요청할 수 있습니다. 이렇게하면 각 토큰이 문제를 해결할 UserDetails 개체에 연결됩니다. 여기에서 어떻게 수행되는지 확인할 수 있습니다. https://labs.hybris.com/2012/06/18/trying-out-oauth2-via-curl/

+1

Thx 아이디어를 확인하십시오. 그러나 클라이언트 자격 증명을 사용하는 요점은 API를 일반적으로 사용자와 독립적으로 만드는 것입니다. 몇 가지 경우 (소수)에서 나는 좀 더 복잡한 규칙을 가지고 있습니까? 클라이언트 자격 증명에 대한 추론을하기 위해 질문을 업데이트했습니다. –

+0

링크가 깨졌습니다. 이 특정 답변의 관련 스 니펫을 가져올 수 있습니까? – Makoto

+0

링크가 수정되었습니다. – achiash

관련 문제