2016-12-02 1 views
0

REST (Spring MVC) 백엔드와 순수 JavaScript frontend가있는 Spring Boot 애플리케이션이있다. 최근 봄 보안을 통해 보안을 활성화했으며 사용자에게 어떤 특권이인지를 UI에 알려주는 방법, 즉 의 역할에 따라 사용자에게 어떤 컨트롤을 제공해야하는지에 대해 논의 중입니다. 내가 뭘하려 들어REST 애플리케이션의 UI에 대한 권한 끝점

:

  • 우리는 단지 노출 및 권한 (역할)의 목록과 엔드 포인트와 함께 UI 거래를 할 수 있습니다. 백엔드에서는 간단하지만 백엔드에서는 ROLE -> Allowed URLs 매핑을 유지하고 프론트 엔드에서 동일하게 처리합니다. 어느 시점에서 이것들은 갈라 지겠지만 (나는 확신한다!) 사용 된 UI 컨트롤은 403 - Unauthorized이 될 것이다. 즉 REST가 무엇 때문에

  • 는 URL의 중심을 확인 : 내가 신청 방법 y를 통해 URL의 X에 액세스 할 수 있습니까 : 질문에 대한 답 : 엔드 포인트 (/security/privileges?url=...&method=...을 말을)이 있나요? 이렇게하면 UI가 URL에만 초점을 맞출 수있게 해줍니다. 그러나/악몽처럼 백엔드 (불가능 보이는 특별히 당신은 @Pre/@Post 주석을 통해 메소드 레벨의 보안 필터를 통해 웹 보안을 결합 할 때

질문 :.

  1. 내가 어떻게 모범 사례를 찾고 있어요를 REST 백엔드에서 UI로 사용자 권한을 전달하는 방법 URL 중심이거나 역할 목록 만 보내야합니까?

  2. URL 중심 접근 방식을 사용하는 사람은 컨트롤러의 Metho 보안 검사를 통과 할 것인가? WebInvocationPrivilegeEvaluator은 메서드 수준의 보안을 고려하지 않으므로 충분하지 않습니다.

편집 : 역할의 목록을 보내와 접근 방식에 대한 나의 의심을 명확히합니다. 내가 할 경우 그 :

MVC 컨트롤러 :

@PreAuthorize("hasAnyRole('ADMIN', 'EDITOR'") 
@RequestMapping("/editStuff") 
public void editStuff(...) { 
    ... 
} 

JS : 역할 EDITOR 또는 ADMIN 중 하나를 가지고위한

if (hasRole('ADMIN') || hasRole('EDITOR')) { 
    showEditControllWhichOnClickCalls('/editStuff'); 
} 

분명이 중복 체크.

if (doIHaveAccessTo('/editStuff', 'POST')) { 
    showEditControllWhichOnClickCalls('/editStuff'); 
} 
+0

가 _ "이 URL 중심이 될하거나 역할의 목록을 보내해야"_ 역할 목록에 대답하려고합니다. URL은 충분하기위한 것입니다. _ "어느 시점에서 이들은 갈라질 것입니다"_ == _ "어느 시점에서 내 코드에는 버그가 포함될 것입니다."_ 이유는 자동 테스트가 있기 때문입니다. – zeroflagL

+0

의견을 보내 주셔서 감사합니다. 두 곳에서 유지되어야하는 중복 된 코드는 나에게 버그와 동일하지 않습니다. 나는 역할 목록을 보내는 것에 대한 나의 의심에 대해 설명해 줄 것이다. –

+0

다른 포인트 뷰를 제안합니다. 백엔드를 잊어 버리고 다른 사람이 제공 한 것이라고 상상해보십시오. 어떤 공개 API의 경우입니다. 클라이언트 앱에 보안을 어떻게 통합하고 싶습니까? Btw : 이제는 클라이언트 애플리케이션을 개발할 때 기존 역할을 포함시키지 못하는 것이 버그라는 것을 알 수 있기를 바랍니다. URL이 충분하지 않습니다. 미디어 유형 A에 대한 권리는 B가 아니라 읽을 수있는 권리가있을 수 있습니다. 그 모두는 UI에 영향을 미칩니다 ... – zeroflagL

답변

0

었 : 로그인 Afer 즉 당신 된 UserDetails 모든 역할 객체를 받아 봐해야하고 다른 한편으로는 JS에서 할 경우 덜 내게 결합 보이는 (그리고 이상적으로 한 곳에서 상수로 URL을 유지) 로그인 한 사용자와 관련된 권한. 이 정보를 바탕으로 사용자가 숨기거나 표시해야하는 UI의 컨트롤을 결정할 수 있습니다.

백엔드 : 성공적으로 로그인 한 후 모든 SSO 시스템을 사용하여 사용자를 인증 할 수 있습니다. 세션, remember-me 토큰은 중요하지 않습니다. SecurityContext의 Authentication 개체로 모든 요청을 연관시키고 다른 서비스에 대한 액세스 권한을 관리 할 수 ​​있습니다.토큰에 대한 당신이 읽을 수 http://docs.spring.io/spring-security/site/docs/3.0.x/reference/remember-me.html

어떤 구체적인 질문을, 나는

관련 문제