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就注册不进去了,花了我一个多小时找原因,不知道是什么鬼。