我是Grails的新手,所以我可能做错了,但也许你可以帮我解决一下。所以我认为这个简单的Grails应用程序与Spring Security插件工作正常。问题是,在GSP页面上,Spring Security标签没有显示我期望的信息,例如:
我有/basket/placeOrder
个端点,所以当我从浏览器点击它时会显示登录页面。
我使用正确的凭据登录,并将其转发到预期的页面(因此看起来认证成功)
println springSecurityService.currentUser.email
它在控制台上打印正确的数据。但是我尝试在GSP上使用例如:
< sec:ifNotLoggedIn>
NOT LOGGED
< /sec:ifNotLoggedIn>
显示NOT LOGGED
。如果我尝试使用例如<sec:loggedInUserInfo field="email" />
检索某些用户信息,则它不会显示任何字符串。就像Spring Security没有与GSP绑定一样。
我做错了什么?缺少一些配置? 感谢。
修改
当我查看SecurityTagLib
ifNotLoggedIn
函数时,它使用了springSecurityService.isLoggedIn()
。当我从控制器调用它时,它返回预期的结果。当我在控制器和GSP中打印session
时,它们完全相同:
SPRING_SECURITY_CONTEXT = org.springframework.security.core.context.SecurityContextImpl@46b66c80: Authentication: org.springframework.security.authentication.UsernamePasswordAuthenticationToken@46b66c80: Principal: grails.plugin.springsecurity.userdetails.GrailsUser@611913a: Username: kamil; Password: [PROTECTED]; Enabled: true; AccountNonExpired: true; credentialsNonExpired: true; AccountNonLocked: true; Granted Authorities: ROLE_ADMIN; Credentials: [PROTECTED]; Authenticated: true; Details: org.springframework.security.web.authentication.WebAuthenticationDetails@43458: RemoteIpAddress: 0:0:0:0:0:0:0:1; SessionId: AAB2217ABEE7EAF752573D44914B0005; Granted Authorities: ROLE_ADMIN
我设法在调试时运行我的应用程序,它变得更加奇怪。首先,我在控制器上的断点显示SpringSecurityService
对象,它的值currentUser
设置正确。然后,同样的请求仍在处理命中SecurityTagLib
中设置的断点(grails只是跟随流控制器 - >渲染),它具有相同的SpringSecurityService对象(这意味着它是相同的bean,没有重复等)但是它只是缺少所有用户数据。怪异!
有些东西肯定是错的,但不知道是什么......
答案 0 :(得分:1)
让我回答我自己的问题,因为我发现了问题所在。 如果代码中的所有内容(眼睛和调试器)看起来很好,我开始检查我的配置,因为它是唯一可能导致一些意想不到的问题的地方,这是一个靶心。我开始想知道application.groovy中定义的spring安全过滤器是否没有引起这些问题,并且结果就是这样。
我正在对控制器中的一个操作(安全@Secured
)使用ROLE_ADMIN
注释,这些操作在被调用时会重定向到其他一些操作(在app config中过滤'none')。当我从配置中删除过滤器并使用注释(@Secured(['permitAll']
用于先前在应用配置中使用过滤器'无'配置的路径时),魔法开始工作。我没有足够的Grails和Spring Security插件经验,因此我不确切知道它为什么会导致问题,所以,如果有人知道具体问题是什么 - 请分享。我只是假设混合应用程序配置过滤器和注释在这种情况下对我不起作用。