2015-06-15 91 views
1

通過customed方法如何我是新來的Spring Security,以及近期在需要做方法級別的安全性的一個項目工作。春天手柄呼籲在@PreAuthorize註釋

我設法處理它象下面這樣:

@Repository 
public class EmployeeDaoImpl{ 
    @PreAuthorize("@mySecurityService.canAdd('ROLE_ADMIN') ") 
    public void addEmployee(EmployeeEntity employee) { 
     try{ 
      this.sessionFactory.getCurrentSession().save(employee);   
     }catch(AccessDeniedException e){ 

     } 
    } 
} 

    @Component 
public class MySecurityService { 

    public boolean canAdd(String user) { 
     System.out.println("Entered has permission.........."); 
     if(user.equals("ROLE_ADMIN")){ 
      return false; 
     } 
     return false; 
    } 
} 

到目前爲止好,寄託都工作正常,順利。

我在這裏的問題是關於性能,如何在Spring後臺調用@PreAuthorize()方法調用方法,做春天做任何類型的對象/方法緩存或代理,或者每次調用方法通過反射,以及這將如何影響性能?

我已經做了很多搜索,只找到了這個鏈接,它幫助了我,但是你有任何特定於@PreAuthorize案件的進一步解釋。

http://spring.io/blog/2007/07/19/debunking-myths-proxies-impact-performance/

希望我的問題是清楚的,謝謝。

回答

0

首先,表達需要被解析,然後纔可以評價。

作爲解析的結果是,表達被轉換成SpelNode秒的樹。特別是MethodReference負責的方法調用一個SpelNode

解析部分在PreInvocationAuthorizationAdvice緩存很好。

MethodReference實施方式的細節可以在這裏找到: org.springframework.expression.spel.ast.MethodReference org.springframework.expression.spel.ast.MethodReference#getValueInternal(...) org.springframework.expression.spel.support.ReflectiveMethodExecutor

有高速緩存和所述java.lang.reflect.Method參考只計算一次(如果目標對象保持相同的類型)。

所以這是Spring可以做的最多的事情。進一步的改進需要字節代碼的生成,這在我看來是一種矯枉過正。