7

Soruma bir cevap Custom annotation with spring security ama cevapsız gitti ve ben sorunun basit bir çözüm olması gerektiğine inanıyorum. Spring Security @PreAuthorization pass enumları doğrudan

Temelde yerine yapıyor:

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

Yapmak istiyorum: bahar güvenlik ile kolayca telin edecek

@PreAuthorize(Someclass.WHATEVER, Permission.READ) 

ya da muhtemelen bazı özel ek açıklama

Bu daha temiz görünüyor bana ve eğer yapabilirsem yapabilmeyi isterdim.

+0

- - senin enum bu

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"; } } 

2 gibi bir kamu nihai static String "DEĞERİ" referans tanımla

1: –

+0

Hayır, mermiyi ısırdım ve dizeleri kullandım = ( – user1751547

cevap

5

Aynı konuyla karşılaştığımda hibrit bir çözüm buldum. Enum'u kabul eden kendi hasPermission() yöntemimi sağlamak için Spring-El ve özel bir fasulye kullanıyorum. Spring'in çalışma zamanında otomatik olarak bir string->enum dönüşümü yaptığı düşünüldüğünde, dizede bir yazım hatası varsa belirli bir enumun bulunmadığı bir çalışma zamanı istisnası alacağım. İdeal çözüm değil (derleme zamanında başarısız olan bir şey vardı), ama kabul edilebilir bir uzlaşma. Bana yarı tip bir güvenlik veriyor. olarak kullanılır

@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; 
    } 
} 

aşağıdaki gibidir: Bu gelecekte başkası yardımcı olabilir

public enum Permission { 
    USER_LIST, 
    USER_EDIT, 
    USER_ADD, 
    USER_ROLE_EDIT 
} 

Umut: İzin sadece normal enum tanımıdır

@PreAuthorize("@securityService.hasPermission({'USER_ADD'})") 
public User addUser(User user){ 
    // create the user 
    return userRepository.save(user); 
} 

. @PreAuthorize içinde Concat MyEnum değerleri

@PreAuthorize("hasPermission('myDomain', '"+ MyEnum.Names.ENUM_A+"')") 
-1

ben de böyle yaptım Bunu çözme şansın var mı? Bugün aynı konuya sahibim.
İlgili konular