我在Grails中使用Spring Security插件。 我有一个控制器,它对某些安全操作使用注释,但不对非安全内容使用注释。 果然,sec:isLoggedIn
和其他sec:loggedInUserInfo
标记适用于安全操作,但即使用户登录了非安全视图,它们也始终显示为未登录。 这是我的控制器的样子:
class ContentController {
def anonymousContent() {
getContent(params, 'pages')
}
@Secured(['ROLE_USER', 'ROLE_ADMIN'])
def secureContent() {
getContent(params, 'secure')
}
private getContent(params, path) {
def viewPath = "${path}/${params.view}"
render(view: viewPath, model: params)
}
}
我应该提到我正在使用一些自定义身份验证作为 SSO 解决方案的一部分,这基本上让我覆盖了几个类,如 AuthenticationProvider
、AbstractAuthenticationToken
、LoginUrlAuthenticationEntryPoint
、AbstractAuthenticationProcessingFilter
,但我认为它不应该导致这个问题。
任何想法将不胜感激。 谢谢
对于遇到此问题的其他任何人,我设法发现该问题与mod_proxy有关。 我使用它来隐藏我的上下文路径,这反过来又导致 servlet 在读取我的应用程序的会话 cookie 时遇到问题。 对于未经身份验证的页面,这意味着它每次都会创建一个全新的会话。 对于经过身份验证的页面,它也会创建一个新会话,但由于我们的 SSO 身份验证机制,它实际上会重新验证每个请求。 可能很好,我们抓住了它,因为这是一项昂贵的操作。 答案实际上是在我们的tomcat配置中将cookie路径(setCookiePath)设置为root('/')。 希望能帮助别人:)