spring security3.x學習(21)_關於方法過濾

本文爲轉載學習java

原文連接:http://blog.csdn.net/dsundsun/article/details/11946949正則表達式

@RolesAllowed("ROLE_USER")
spring

public void changePassword(String username, String password); express

編程

@RolesAllowed({"ROLE_USER","ROLE_ADMIN"})
public void changePassword(String username, String password);
安全

"正如咱們可能推斷出的那樣,@RolesAllowed註解並不支持SpEL 表達式。學習

"JSR-250還有兩個其它的註解:@PermitAll 和@DenyAll。它們的功能正如你所預想的,容許和禁止對方法的任何請求。spa

在看一下@Secured註解實現方法安全:.net

<global-method-security secured-annotations="enabled"/>

由於@Secured與JSR標準的@RolesAllowed註解在功能上一致,因此並無充分的理由在新代碼中使用它,可是它可以在Spring的遺留代碼中運行代理

還有一種,AOP技術:

實現方法安全的最後一項技術也多是最強大的方法,它還有一個好處是不須要修改源代碼。做爲替代,它使用面向方面的編程方式爲一個方法或方法集合聲明切點(pointcut),而加強(advice)會在切點匹配的狀況下進行基於角色的安全檢查。AOP的聲明只在Spring Security的XML配置文件中並不涉及任何的註解。 

<global-method-security>
  <protect-pointcut access="ROLE_ADMIN" expression="execution(* com.packtpub.springsecurity.service.IUserService.*(..))"/> 
  <protect-pointcut access="ROLE_ADMIN" expression="execution(* com.packtpub.springsecurity.service.I*Service.*(..))"/>
</global-method-security>

比較方法受權的類型:

如下這段話值得注意:

強烈建議在接口上聲明AOP規則(以及其它的安全註解),而不是在實現類上。使用類(經過Spring的CGLIB代理)進行聲明可能會致使應用出現不可預知的行爲改變,一般在正確性方面比不上在接口定義安全聲明(經過AOP)。

spring security還提供了一種方式:

xmlns:security="http://www.springframework.org/schema/security"(聲明)
<bean id="userService" class="com.packtpub.springsecurity.service.UserServiceImpl">
  <security:intercept-methods>
    <security:protect access="ROLE_USER" method="changePassword"/>
  </security:intercept-methods>
</bean>

這種方式能夠在配置文件上直接指定哪一個方法須要哪一個屬性,不過書中這樣描述它:

儘管閱讀起來很容易,可是這種方式的方法安全聲明在表現性上不如切點,在功能上不如咱們已經見過的註解方式。可是,對於必定類型的工程,使用XML聲明的方式足以知足你的需求。

可使用簡單的通配符來註明方法名,如,咱們能夠用以下的方式保護給定bean裏全部的set方法:

<security:intercept-methods>
  <security:protect access="ROLE_USER" method="set*"/>
</security:intercept-methods>

方法名匹配能夠包含前面或後面的正則表達式匹配符(*)。這個符號的存在乎味着要對方法名進行通配符匹配,爲全部匹配該正則表達式的方法添加攔截器。注意,其它經常使用的正則表達式操做符(如?或[)並不支持。請查閱相關的Java 文檔以理解基本的正則表達式。更復雜的通配符匹配或正則匹配並不支持。

@PreAuthorize("#username == principal.username and hasRole('ROLE_USER')")
public void changePassword(String username, String password);

「Spring Security方法註解所綁定的SpEL支持更復雜的表達式,包括含有方法參數的表達式。

相關文章
相關標籤/搜索