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
可以看到在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就註冊不進去了,花了我一個多小時找原因,不知道是什麼鬼。