grails 查看插件
我正在寻找一种使用Spring Security Core插件成功登录用户后挂钩业务逻辑的方法。 最简单的方法是注册回调闭包。 它让您在某些Spring Security事件发生后将自定义代码挂接到Config.groovy中 。
如果您不熟悉此插件,请访问关于Spring Security Core插件的上一教程 。
注册回调关闭
当您想在某些Spring Security Core事件上挂接业务逻辑时,可以编辑grails-app / conf / Config.groovy并添加如下内容:
grails.plugins.springsecurity.useSecurityEventListener = true
grails.plugins.springsecurity. onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
// add custom code here
}
grails.plugins.springsecurity. onAbstractAuthenticationFailureEvent = { e, appCtx ->
// add custom code here
}
grails.plugins.springsecurity. onAuthenticationSuccessEvent = { e, appCtx ->
// add custom code here
}
grails.plugins.springsecurity. onAuthenticationSwitchUserEvent = { e, appCtx ->
// add custom code here
}
grails.plugins.springsecurity. onAuthorizationEvent = { e, appCtx ->
// add custom code here
}
使用此功能时,如上面第一行所示,将grails.plugins.springsecurity.useSecurityEventListener设置为true很重要。
- 当用户进行身份验证时,Spring Security最初会触发AuthenticationSuccessEvent(onAuthenticationSuccessEvent回调)。 在Authentication在SecurityContextHolder中注册之前会触发此事件,这意味着访问已登录用户的springSecurityService方法将不起作用。
- 在稍后的处理中,将触发第二个事件,即InteractiveAuthenticationSuccessEvent(onInteractiveAuthenticationSuccessEvent回调),当发生这种情况时,SecurityContextHolder将具有身份验证。
- 这意味着,如果您不需要检索已登录的用户,则可以连接到onAuthenticationSuccessEvent 。 否则,请与onInteractiveAuthenticationSuccessEvent挂钩。
例
本示例将所有成功的登录记录到数据库表中。
模型
我认为用户的模型是SecUser所讨论这里 。
日志将保存在SecUserLog数据模型中。
class SecUserLog {
String username
String action
static constraints = {
username blank: false, nullable: false
action blank: false, nullable: false
}
}
服务
我创建了一个服务,用于将所有业务逻辑包装到SecUserLog域。 我使用了一项服务,稍后展示如何在Config.groovy中访问它。
class SecUserLogService {
static transactional = true
def securityService
def addUserLog(String action) {
SysUser user = securityService.getLoggedUser()
SysUserActionLog log = new SysUserActionLog(username:user.username, action:action)
log.save()
}
}
请注意,服务securityService来自Spring Security Core插件。
Config.groovy条目
这是我在Config.groovy中添加的代码:
grails.plugins.springsecurity.useSecurityEventListener = true
grails.plugins.springsecurity.onInteractiveAuthenticationSuccessEvent = { e, appCtx ->
def secUserLogService = appCtx.getBean('secUserLogService')
secUserLogService.addUserLog("login")
}
appCtx对象是应用程序上下文,可用于查找包含服务的Spring托管bean。 之后,您可以随意使用该服务。
grails 查看插件