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

猜你喜欢

转载自blog.csdn.net/pushme_pli/article/details/85265160
今日推荐