1. 程式人生 > >Spring auth2的許可權控制表示式遇到的問題

Spring auth2的許可權控制表示式遇到的問題

下午花了時間探索了下Spring security中的許可權控制表示式, Spring在version 3.0的時候引入了EL表示式,並內建了一些。

這些表示式在定義方法級別的許可權控制時非常有用,感受一下:

在Spring Security中有四個annotation支援EL表示式:@PreAuthorize, @PreFilter, @PostAuthorize 和@PostFilter.

今天想記錄的是hasPermission這個表示式。

因為我們的應用是基於permission實現許可權控制的,所以試了試內建的hasPermission發現並不好使,因為這個hasPermission是跟Spring自己的ACL實現繫結在一起的,而我們的鑑權系統跟Spring的還有差異,不能直接用。

但是Spring提供custom的方法可以讓我們實現自己的hasPermission。

PermissionEvaluator

這是個interface

https://docs.spring.io/spring-security/site/docs/4.2.5.RELEASE/apidocs/org/springframework/security/access/PermissionEvaluator.html

可以看到在Spring中已知的實現類中有一個:AclPermissionEvaluator, 猜測就不好使的那個。

實現這個interface需要完成方法:

  • public boolean hasPermission(Authentication authentication, Object targetDomainObject, Object permission)
  • public boolean hasPermission(Authentication authentication, Serializable targetId, String targetType, Object permission) 

看看這兩個方法的簽名:

  • authentication: Spring Security中的儲存鑑權資訊(User, role, permission)的Object
  • targetDomainObject: 不知道是個啥,可以放任何物件:比如說#requestObj 可以表示方法引數表中的一個物件, #returnobject可以是方法的返回物件
  • targetId&targetType: 跟上面的其實是一個東西,只不過上面的是個instance,這個是id和type
  • permission: 真正的permission

GlobalMethodSecurityConfiguration

實現了PermissionEvaluator還需進行配置讓我們的evaluator生效:

要吐槽的就是這了,怎麼弄我自己實現的PermissionEvaluator都不工作,還是在使用AclPermissionEvaluator,怎麼弄都不好使,後來發現是@EnableGlobalMethodSecurity作祟,這個東西只能在上下文中宣告一次,多於一次自己的PermissionEvaluator就註冊不進去了,花了我一個多小時找原因,不知道是什麼鬼。