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() 정도 이다.
그냥 알아만 두자.
'Spring > JPA + Security' 카테고리의 다른 글
[Spring] 회원 수정 에서 유효성 처리 하기 -2 DB에 없는 값 (0) | 2023.01.08 |
---|---|
[Spring] 회원 수정 에서 유효성 처리하기 - 2 Exception Handler 적용 (0) | 2023.01.07 |
[Spring Data JPA] 데이터 수정하기 + AJAX 포함 예제 (0) | 2023.01.07 |
[Spring Security] 스프링 시큐리티의 로그인 세션의 위치, @AuthenticationPrincipal 예제 (0) | 2023.01.07 |
스프링 시큐리티에서의 로그인 - 시큐리티한테 위임 (0) | 2023.01.07 |
댓글