본문 바로가기
Spring/JPA + Security

[Spring Security] 세션을 JSP로 넘기는 방법 2가지

by pyogowoon 2023. 1. 7.

1.첫번째방법

 @GetMapping("/user/{id}/update")
    public String update(@PathVariable int id, @AuthenticationPrincipal PrincipalDetails principalDetails, Model model){
        System.out.println("세션 정보 : " + principalDetails.getUser());
        model.addAttribute("principal", principalDetails.getUser());
        return "user/update";
    }
}

매개변수에 model 선언하고

세션으로 받아온 PrincipalDetails 를

model.addAtribute 에 담는다, 담아서 jsp 가서 EL태그 사용하기 

 

<input type="text" name="name" placeholder="이름"
   value="${principal.name}" />

 

 

2. 두번째방법

 

  @GetMapping("/user/{id}/update")
    public String update(@PathVariable int id, @AuthenticationPrincipal PrincipalDetails principalDetails){
      
        
        return "user/update";
    }
}

model 매개변수 지우고 model관련 삭제 

 

gradle에 Security-taglib 추가 후

implementation 'org.springframework.security:spring-security-taglibs'
<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>

<sec:authorize access ="isAuthenticated()">
    <sec:authentication property="principal" var="principal"/>
    </sec:authorize>

만약 본인이 include header 사용하고 있다면 header 최상단에 선언하면 header가 포함된 곳에서 사용 가능,

그게 아니라면 최상단에 EL태그 사용하듯 선언하면 된다.

 

 다만 문법 약간 다른데 

EL태그면 ${principal.username} 이였지만

sec-tag는 ${principal.user.username} 이런식

이유는 sec tag 의 scope 가 UserDetails 까지여서 그렇다.

 

 


<!-- Spring Security taglib -->

<%@ taglib prefix="sec" uri="http://www.springframework.org/security/tags"%>

<sec:authorize access ="isAuthenticated()">
    <sec:authentication property="principal" var="principal"/>
    </sec:authorize>

<!-- Spring Security taglib 끝 -->

 

 

<input type="text" name="name" placeholder="이름"
   value="${principal.user.name}" />

이렇게 하면 2가지 방법 끝.

 

 

 

 

추가적으로 Spring Security taglib 종류로는

 

Common built-in expressions

Expression Description
hasRole([role]) 현재 주체에 지정된 역할이 있는지 여부를 반환 합니다. 제공된 역할이 'ROLE_'로 시작하지 않으면 기본적으로 추가됩니다. DefaultWebSecurityExpressionHandler의 defaultRolePrefix을 수정하여 사용자 정의를 할 수 있습니다.
hasAnyRole([role1,role2]) 현재 주체에 제공된 역할 (쉼표로 구분 된 문자열 목록으로 제공됨)이 있는지 여부를 반환 합니다. 제공된 역할이 'ROLE_'로 시작하지 않으면 기본적으로 추가됩니다. DefaultWebSecurityExpressionHandler의 defaultRolePrefix을 수정하여 사용자 정의를 할 수 있습니다.
hasAuthority([authority]) 현재 주체에 지정된 권한이 있는지 여부를 반환 합니다.
hasAnyAuthority([authority1,authority2]) 현재 주체에 제공된 역할 (쉼표로 구분 된 문자열 목록으로 제공됨)이 있는지 여부를 반환 합니다.
principal 현재 사용자를 나타내는 주체 개체에 직접 액세스 할 수 있습니다.
authentication SecurityContext Authentication에서 얻은 현재 개체에 직접 액세스 할 수 있습니다.
permitAll 항상 허용
denyAll 항상 불허
isAnonymous() 현재 주체가 익명 사용자인 경우 true 반환
isRememberMe() 현재 주체가 remember-me 사용자 인 경우 true 반환
isAuthenticated() 사용자가 익명이 아닌 경우 true 반환
isFullyAuthenticated() 사용자가 익명 또는 remember-me 사용자가 아닌 경우 true 반환
hasPermission(Object target, Object permission) 사용자가 주어진 권한에 대해 제공된 대상에 액세스 할 수 있는지 여부를 반환합니다. 예를 들면 hasPermission(domainObject, 'read')
hasPermission(Object targetId, String targetType, Object permission) 사용자가 주어진 권한에 대해 제공된 대상에 액세스 할 수 있는지 여부를 반환합니다. 예를 들면 hasPermission(1, 'com.example.domain.Message', 'read')

이중 많이 쓰이는것은 hasAnyRole() isAuthenticated() isAnonymous() 정도 이다.

그냥 알아만 두자.

댓글