복붙노트

[SPRING] 조건부로 사용자가 JSP로 렌더링

SPRING

조건부로 사용자가 JSP로 렌더링

스프링 보안 및 MVC 프레임 워크를 사용하기위한 간단한 포럼을 만들려고합니다.

간단히하기 위해 다음과 같은 포럼 게시물을 볼 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과 원저자 만 편집 링크를 볼 수 있습니다. 그러나 사용자가 security : authorize 태그를 사용하여 필터링하는 방법을 모르거나 다른 방식으로이 태그를 사용해야하는 경우

어떤 제안이라도 대단히 감사 할 것입니다. 감사!

해결법

  1. ==============================

    1.이 페이지 뒤에 컨트롤러가 있다고 가정하면 ModelEndView에 canEditPost 필드를 추가하면됩니다 (세미 의사 코드).

    이 페이지 뒤에 컨트롤러가 있다고 가정하면 ModelEndView에 canEditPost 필드를 추가하면됩니다 (세미 의사 코드).

    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());
    

    그리고 나서 $ canEditPost를 참조하십시오.

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

  2. ==============================

    2.Author 객체가 각 작성자가 고유 한 방식으로 equals를 구현합니까?

    Author 객체가 각 작성자가 고유 한 방식으로 equals를 구현합니까?

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

  3. ==============================

    3.당신은 조건을 가질 수 있습니다.

    당신은 조건을 가질 수 있습니다.

    <% if(mycondition.isTrue()){ %>
    <security:authorize ifAnyGranted="ROLE_ADMIN">
        Edit: <a href="/edit">Edit</a>
    </security:author
    <% }%>
    
  4. ==============================

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

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

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

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

    그래서, 내 JSP에서 다음 사용할 수 있습니다.

    보안 : authorize ifAnyGranted = "MESSAGE_EDIT"

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

    그것은 소리보다 약간 더 많은 일이지만, 확실히 할 수 있습니다.

    이 모든 것에 대한 일부 문서는 Spring Security Reference Documentation의 Domain Object Security 섹션에서 찾을 수 있습니다 (http://static.springframework.org/spring-security/site/reference/html/springsecurity.html (어떤 이유로 link 도메인 객체 보안 섹션은 현재 깨져 있습니다.)).

  5. from https://stackoverflow.com/questions/935666/conditionally-render-in-jsp-by-user by cc-by-sa and MIT license