如何使用拦截器为 Grails 3 中的每个方法应用不同的安全约束
How to apply different security constraints for each method in Grails 3, using interceptors
Grails 3 引入了 Interceptors 来处理诸如对各种控制器操作应用安全约束之类的事情。
我有一个 Thing
控制器,有很多操作。这些操作分为三个不同的组,每个组都需要不同的安全角色。
index
,list
,status
操作需要角色 "viewer"
edit
,save
动作需要角色 "editor"
delete
操作需要安全角色 "admin"
我可以将其实现为三个独立的拦截器:
class ThingInterceptor1 {
ThingInterceptor1(){
match(controller:'thing', action:~/(index|list|status)/)
}
before() {
verifyUserHasRole('viewer')
}
}
class ThingInterceptor2 {
ThingInterceptor1(){
match(controller:'thing', action:~/(edit|save)/)
}
before() {
verifyUserHasRole('editor')
}
}
class ThingInterceptor3 {
ThingInterceptor1(){
match(controller:'thing', action:'delete')
}
before() {
verifyUserHasRole('admin')
}
}
我有很多这样的控制器,所以理想情况下,我想在一个拦截器中应用所有这些约束,像这样:
class ThingInterceptor {
ThingInterceptor(){
match(controller:'thing', action:~/(index|list|status)/)
match(controller:'thing', action:~/(edit|save)/)
match(controller:'thing', action:'delete')
}
...
但是我如何确定 before
方法中的动作名称?我正在寻找这样的东西:
before() {
def actionName = ????
if(actionName.matches(~/(index|list|status)/)){
verifyUserHasRole('viewer')
}
else if(actionName.matches(~/(edit|save)/){
verifyUserHasRole('editor')
}
else if(actionName == 'delete'){
verifyUserHasRole('admin')
}
}
有没有办法在一个拦截器中完成这个,或者我必须把它分成三个不同的拦截器,一个用于每组动作?
正如@Joch 指出的那样,您可以通过 actionName
获取操作名称,但似乎没有任何地方记录拦截器。
Grails 3 引入了 Interceptors 来处理诸如对各种控制器操作应用安全约束之类的事情。
我有一个 Thing
控制器,有很多操作。这些操作分为三个不同的组,每个组都需要不同的安全角色。
index
,list
,status
操作需要角色 "viewer"edit
,save
动作需要角色 "editor"delete
操作需要安全角色 "admin"
我可以将其实现为三个独立的拦截器:
class ThingInterceptor1 {
ThingInterceptor1(){
match(controller:'thing', action:~/(index|list|status)/)
}
before() {
verifyUserHasRole('viewer')
}
}
class ThingInterceptor2 {
ThingInterceptor1(){
match(controller:'thing', action:~/(edit|save)/)
}
before() {
verifyUserHasRole('editor')
}
}
class ThingInterceptor3 {
ThingInterceptor1(){
match(controller:'thing', action:'delete')
}
before() {
verifyUserHasRole('admin')
}
}
我有很多这样的控制器,所以理想情况下,我想在一个拦截器中应用所有这些约束,像这样:
class ThingInterceptor {
ThingInterceptor(){
match(controller:'thing', action:~/(index|list|status)/)
match(controller:'thing', action:~/(edit|save)/)
match(controller:'thing', action:'delete')
}
...
但是我如何确定 before
方法中的动作名称?我正在寻找这样的东西:
before() {
def actionName = ????
if(actionName.matches(~/(index|list|status)/)){
verifyUserHasRole('viewer')
}
else if(actionName.matches(~/(edit|save)/){
verifyUserHasRole('editor')
}
else if(actionName == 'delete'){
verifyUserHasRole('admin')
}
}
有没有办法在一个拦截器中完成这个,或者我必须把它分成三个不同的拦截器,一个用于每组动作?
正如@Joch 指出的那样,您可以通过 actionName
获取操作名称,但似乎没有任何地方记录拦截器。