在互联网上进行了长时间的研究后,终于让它与@yariash 的回复和这篇文章中的一些想法一起工作:
import org.springframework.context.ApplicationListener;
import org.springframework.security.access.event.AuthorizationFailureEvent
import org.springframework.security.authentication.RememberMeAuthenticationToken;
class AuthorizationFailureEventListener
implements ApplicationListener<AuthorizationFailureEvent> {
@Override
public void onApplicationEvent(AuthorizationFailureEvent e) {
def attributes = e.getConfigAttributes()
if(!attributes) {
return
}
def authentication = e.getAuthentication()
def requiredAuthorities = attributes?.collect { it.getAttribute() }
def userAuthorities = authentication.getAuthorities().collect { it.getAuthority() }
def missingAuthorities = requiredAuthorities - userAuthorities
if(requiredAuthorities.contains('IS_AUTHENTICATED_FULLY') &&
!(authentication instanceof RememberMeAuthenticationToken)) {
requiredAuthorities.remove('IS_AUTHENTICATED_FULLY')
}
e.getSource().getRequest().setAttribute("MISSING_AUTHORITIES", missingAuthorities);
}
}
然后将此侦听器作为 bean 包含:
beans = {
//...
authorizationFailureEventListener(AuthorizationFailureEventListener) { bean ->
bean.autowire = "byName"
}
//...
}
最后在我的错误控制器中:
static mappings = {
//....
"403"(controller:'error', action:'error403')
//......
}
class ErrorController {
def error403() {
def missingAuthorities = request.getAttribute("MISSING_AUTHORITIES")
// Render the right view based on the missing authorities
}
}