7

내 질문은 Custom annotation with spring security과 중복되지만 답이 나오지 않아 문제에 대한 간단한 해결책이 있어야한다고 생각한다. 스프링 보안 @PreAuthorization은 직접 열거 형을 전달한다

기본적으로 대신하고 :

@PreAuthorize("hasPermission(T(fully.qualified.Someclass).WHATEVER, T(fully.qualified.Permission).READ") 

내가하고 싶은 : 봄 보안과 쉽게 연결할 것

@PreAuthorize(Someclass.WHATEVER, Permission.READ) 

또는 아마도 일부 사용자 지정 주석

이 훨씬 청소기 보인다 내가 할 수 있으면 그것을 할 수 있기를 바란다.

+0

- - 당신의 열거이

public enum MyEnum { ENUM_A(Names.ENUM_A); private String value; private MyEnum (String value) { this.value = value; } public static class Names { public final static String ENUM_A = "ENUM_A"; } } 

이 같은 공공 최종 정적 문자열 "VALUE"를 참조 정의

1 : –

+0

아니요, 글 머리 기호를 물고 문자열 = ( – user1751547

답변

5

같은 문제에 직면하여 하이브리드 솔루션으로 마무리되었습니다. 나는 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+"')") 
-1

나는 그런 식으로했다 어떤 행운이 해결? 오늘 같은 문제가 있습니다.