我一直在浏览SpringSecurityService.groovy文件(grails.plugins.springsecurity包的一部分),并且它们中的某些代码行使我感到困惑。
import javax.servlet.http.HttpServletRequest
import org.codehaus.groovy.grails.plugins.springsecurity.SpringSecurityUtils
import org.springframework.security.core.Authentication
import org.springframework.security.core.context.SecurityContextHolder as SCH
import org.springframework.security.web.access.intercept.FilterInvocationSecurityMetadataSource
class SpringSecurityService {
/** dependency injection for authenticationTrustResolver */
def authenticationTrustResolver
....
....
boolean isLoggedIn() {
def authentication = SCH.context.authentication
authentication && !authenticationTrustResolver.isAnonymous(authentication)
}
....
这些是文件中提到
authenticationTrustResolver
的所有位置。我的问题是,authenticationTrustResolver.isAnonymous()
在哪里定义?我已经查看了导入的文件,但似乎不在其中。我认为该功能可能会给我带来一些麻烦,但我不知道如何查看其代码。 最佳答案
例如,Grails在服务, Controller 和TagLib中使用了依赖注入(inject)的概念。这意味着您可以声明一个属性(在本例中为authenticationTrustResolver
),并且在使用服务实例时,依赖项实例已经存在。
Grails plugins有一个带有插件名称的特殊类,您可以在其中声明此依赖项。名称始终以GrailsPlugin.groovy结尾,因此在这种情况下为SpringSecurityCoreGrailsPlugin。
在doWithSpring
闭包中,插件定义了他的bean:
def doWithSpring = {
...
/** authenticationTrustResolver */
authenticationTrustResolver(AuthenticationTrustResolverImpl) {
anonymousClass = conf.atr.anonymousClass
rememberMeClass = conf.atr.rememberMeClass
}
...
}
您可以检查有关Grails and Spring in the docs的更多信息。