我正在浏览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()
定义在哪里?我查看了导入的文件,但它似乎没有在那里。我认为这个功能可能给我带来了一些麻烦,但我不知道怎么看它的代码。
答案 0 :(得分:3)
例如,Grails在Services,Controllers和TagLibs中使用依赖注入的概念。这意味着您可以声明一个属性(在本例中为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。
的更多信息