같은 문제에 직면하여 하이브리드 솔루션으로 마무리되었습니다. 나는 Enum을 받아들이는 내 자신의 hasPermission()
메소드를 제공하기 위해 Spring-El과 커스텀 빈을 사용하고있다. 스프링이 자동으로 string->enum
변환을 수행한다는 것을 감안할 때 런타임에는 문자열에 오타가있을 경우 특정 열거 형이 존재하지 않는 런타임 예외가 발생합니다. 이상적인 솔루션 (컴파일 타임에 실패한 것이 있었음)이 아니라 수용 가능한 절충안입니다. 세미 타입의 안전성을 제공합니다. 로 사용
@Component("securityService")
public class SecurityService {
public boolean hasPermission(Permission...permissions){
// loop over each submitted role and validate the user has at least one
Collection<? extends GrantedAuthority> userAuthorities = SecurityContextHolder.getContext().getAuthentication().getAuthorities();
for(Permission permission : permissions){
if(userAuthorities.contains(new SimpleGrantedAuthority(permission.name())))
return true;
}
// no matching role found
return false;
}
}
은 다음과 같습니다이 미래에 다른 사람을 도울 수
public enum Permission {
USER_LIST,
USER_EDIT,
USER_ADD,
USER_ROLE_EDIT
}
희망 : 권한 그냥 보통의 열거 정의입니다
@PreAuthorize("@securityService.hasPermission({'USER_ADD'})")
public User addUser(User user){
// create the user
return userRepository.save(user);
}
. @PreAuthorize에서 CONCAT MyEnum 값
@PreAuthorize("hasPermission('myDomain', '"+ MyEnum.Names.ENUM_A+"')")
- - 당신의 열거이
이 같은 공공 최종 정적 문자열 "VALUE"를 참조 정의
1 : –
아니요, 글 머리 기호를 물고 문자열 = ( – user1751547