2013-08-27 18 views
5

Yöntemleri denetleme izni için Spring Security kullanıyorum. HasPermission() yöntemine göndermek için bazı verileri toplamak için özel bir yöntem aramak istiyorum. Çalıştırmaya çalıştığım bir şey var ve SpelEvaluationException alıyorum çünkü Spring MethodSecurityExpressionRoot'ta localPrivateMethod'u arıyor. bunu arşivlemenin bir yolu var mı? Teşekkürler.Spring @PreAuthorize özel bir yöntem çağırın

@PreAuthorize("hasPermission(new Object[]{#arg3, #localPrivateMethod(#arg1,#arg2)}, 'canDoThis')") 
    public long publicMethod1(long arg1, long arg2, long arg3) 
    { 
    } 

    private String localPrivateMethod(long a1, long a2) 
    { 
    } 
+0

genel yaklaşım şöyledir: http://stackoverflow.com/questions/13564627/spring-aop-not -kullanıcı-için-yöntem-çağrı-içinde-başka-yöntem –

cevap

18

Özel bir yöntemi çağıramazsınız, ancak başka bir yay fasulyesinde bir yöntemi çağırabilirsiniz. Uygulamamda allowEvaluator adlı bir @Component var.

@PreAuthorize("@permissionEvaluator.canViewImageSet(#imageSet, principal)") 
@RequestMapping(value="/image", method=RequestMethod.GET) 
public String getImage(
     @RequestParam(value="imageSet", required=false) ImageSet imageSet) { 
    // method body 
} 

PermissionEvaluatorImpl şuna benzer::

@Component(value="permissionEvaluator") 
public class PermissionEvaluatorImpl implements PermissionEvaluator 
{ 
    public PermissionEvaluatorImpl() {} 

    /** 
    * Determine if a user can view a given image. 
    */ 
    public boolean canViewImageSet(ImageSet imageSet, UserDetailsAdapter user) 
    { 
     // code to see if they should view this image 
    } 
} 

ve PermissionEvaluator özel bir şey, ben değerlendirmek gerek sadece ne olursa olsun yöntemlerle kendi arayüzü Sonra şöyle bir @PreAuthorize ona gönderimde.

+0

Ben benzer bir sorunu araştırırken tam bir saat geçirdim ve cevabını gördüğümde bu bahar proxy'leri aynı sınıflarda yöntemleri çağırırken, diğer sınıflar vekiller için önleme uygulayıcıları hatırlıyorum hatırlıyorum t uygulanmalıdır http://stackoverflow.com/questions/13564627/spring-aop-not-working-for-method-call-inside-another-method –

+0

Başka bir şey yapman gerekiyor mu? Tam olarak denedim ve işe yaramayacak. – Tim

+0

Eğer AllowEvaluator'ınız bir fasulye ise, o zaman iyi olmalısınız. Fasulyeinizi bileşen taraması kullanmak yerine el ile kuruyorsanız, o zaman AllowEvaluator fasulyesinin var olduğundan emin olmanız gerekir. – digitaljoel

0

Özel yöntemler denilen olamaz, ancak this. aracılığıyla "Bu bileşen" başvurabilir:

@PreAuthorize("hasPermission(new Object[]{#arg3, /* HERE: */ this.localPublicMethod(#arg1,#arg2)}, 'canDoThis')") 
public long publicMethod1(long arg1, long arg2, long arg3) 
{ 
} 

public String localPublicMethod(long a1, long a2) 
{ 
} 
İlgili konular