2009-06-01 2 views
2

스프링 보안 및 MVC 프레임 워크를 사용하기위한 간단한 포럼을 만들려고합니다. 단순화하기 위해조건부로 JSP로 렌더링하기

, 나는처럼 보이는 포럼 게시물을 볼 수있는 JSP가하자 다음

<body> 
    ... 

    Title: ${forumPost.title} <br> 
    Author: ${forumPost.author.name} <br> 
    Message: {forumPost.message} <br> 

    <security:authorize ifAnyGranted="ROLE_ADMIN"> 
     Edit: <a href="/edit">Edit</a> 
    </security:authorize> 

    ... 
</body> 

내 문제는 다음과 같습니다뿐만 관리자가이 게시물을 편집 할 수 있지만한다 원저자도 가능해야합니다. 따라서 ROLE_ADMIN과 원저자 만 편집 링크를 볼 수 있습니다. 그러나 사용자가 보안을 사용하여 필터링하는 방법을 잘 모르겠다 : 태그를 승인하거나 다른 방식으로 처리해야하는 경우.

모든 의견을 많이 주시면 감사하겠습니다. 감사!

+0

(http://static.springframework.org/spring-security/site/reference/html/springsecurity.html) 그리고 이것에 대해서는 아무 것도없고, 심지어는 태그에 대한 문서가없는 것 같습니다. –

답변

3

이 페이지 뒤에 앉아 컨트롤러를 가지고 있다고 가정하면, 단순히 (반 의사) 같은 것을 보이는 ModelAndViewcanEditPost 필드를 추가 $ canEditPost.

보기에서 일반적으로보기/템플릿이 실제 논리를 수행하는 것보다 단순한 플래그를 참조하는 것이 좋습니다.

0

Author 개체는 각 저자가 고유 한 방식으로 equals을 구현합니까?

그렇다면 Author이 현재 사용자와 동일한 지 (두 세트의 태그가 있음) 간단히 확인할 수 있습니다.

private boolean isAdmin() { 
    Authentication currentAuthObj = SecurityContextHolder.getContext().getAuthentication(); 
    List<GrantedAuthority> authorities = Arrays.asList(currentAuthObj.getAuthorites()); 
    for (GrantedAuthority auth : authorities) { 
     if ("ROLE_ADMIN".equals(auth.getAuthority())) { 
      return true; 
     } 
    } 
    return false; 
} 

boolean currentUserIsAuthor = ...; 

modelAndView.addObject("canEditPost", 
    Boolean.valueOf(currentUserIsAuthor || isAdmin()); 

그리고보기에 단지 참조 :

+0

이 작업은 가능하지만, 이상적으로 스프링 보안 프레임 워크의 범위 내에서이를 수행하는 방법을 찾고 싶습니다. –

0

@matt b의 대답은 그것을 수행하는 가장 좋은 방법이며 아마 내가 끝낼 것입니다. 그러나 나는 조금 더 복잡하지만이 포스트에 넣은 것을 성취 할 다른 방법을 발견했다.

나는 약간의 독서를했으며 도메인 객체 수준에서 보안을 처리 할 수 ​​있고 역할이나 임의의 객체 (예 : 현재 사용자 ID)에 읽기/쓰기/삭제 권한을 부여 할 수 있음을 알았습니다. 이 예제에서는 현재 사용자 ID에 도메인 객체 (이 경우 데이터베이스의 고유 한 ID가있는 ForumPost 객체)에 대한 액세스 권한을 부여합니다.

현재 사용자 ID에 읽기 및 쓰기 권한이 부여되며 XML 구성을 통해 사용자 지정 역할로 정의 될 수 있습니다 (올바른 용어는 실제로 유권자입니다). 그런 다음이 유권자의 이름을 지정할 수 있습니다. MESSAGE__EDIT.

보안 :

그래서, 내 JSP에서 나는 다음을 사용할 수 ifAnyGranted = "MESSAGE_EDIT"

권한을 부여 그리고 그것은 (XML 구성을 통해, 다시)하고자 현재 사용자 ID를 얻을 현재 도메인 객체 (이 경우에는 ForumPost 객체)를 기반으로 액세스 권한을 부여합니다.

소리보다 약간 더 많은 작업이지만 분명히 할 수 있습니다.

일부 문서는 스프링 보안 참조 문서 (http://static.springframework.org/spring-security/site/reference/html/springsecurity.html)의 도메인 객체 보안 섹션에서 찾을 수 있습니다 (어떤 이유로 인해 도메인 객체 보안 섹션에 대한 링크가 지금은 깨졌습니다).

0

당신이 조건

을 가질 수
<% if(mycondition.isTrue()){ %> 
<security:authorize ifAnyGranted="ROLE_ADMIN"> 
    Edit: <a href="/edit">Edit</a> 
</security:author 
<% }%> 
나는 봄 보안 참조 문서에서 본 추가해야
+0

예 알아요. @TM에 언급했듯이 Spring Security 프레임 워크의 범위 내에서이를 수행하는 방법을 찾고 싶습니다. 스크립틀릿을 사용하지 않는 것이 좋습니다 (예 : <% %>). –