为什么赢了';t@Secured注释在GrailsSpring安全性手动登录后是否工作?
我一直在尝试使用grails with spring security core插件成功注册后自动登录用户。当强制登录有效,并且加载了所有权限等时,其他控制器中的@Secured注释将无法识别授予的权限,因此浏览器会在安全页面和登录页面之间陷入重定向循环 我的登录操作:为什么赢了';t@Secured注释在GrailsSpring安全性手动登录后是否工作?,grails,annotations,spring-security,Grails,Annotations,Spring Security,我一直在尝试使用grails with spring security core插件成功注册后自动登录用户。当强制登录有效,并且加载了所有权限等时,其他控制器中的@Secured注释将无法识别授予的权限,因此浏览器会在安全页面和登录页面之间陷入重定向循环 我的登录操作: def forceLogin = { PSysuser sysuser = flash.sysuser; String username = flash.username ?: params.username; St
def forceLogin = {
PSysuser sysuser = flash.sysuser;
String username = flash.username ?: params.username;
String password = flash.password ?: params.password;
UsernamePasswordAuthenticationToken token = new UsernamePasswordAuthenticationToken(
sysuser?.username ?: username,
sysuser?.password ?: password
);
request.session;
token.details = new WebAuthenticationDetails(request);
Authentication authenticatedUser = authenticationManager.authenticate(token);
SecurityContextHolder.context.authentication = authenticatedUser;
springSecurityService.reauthenticate(username, password); //doesn't appear to work, but doesn't hurt either.
redirect action:auth;
}
有人知道如何让注释正常工作吗?如果您使用的是spring安全插件,请查看一些注释。更具体地说,请查看SpringSecurityService的重新验证方法。下面是Burt惊人的文档中的一个示例:
class UserController {
def springSecurityService
def update = {
def userInstance = User.get(params.id)
params.salt = person.salt
if (userInstance.password != params.password) {
params.password = springSecurityService.encodePassword(params.password, salt)
def salt = … // e.g. randomly generated using some utility method
params.salt = salt
}
userInstance.properties = params
if (!userInstance.save(flush: true)) {
render view: 'edit', model: [userInstance: userInstance]
return
}
if (springSecurityService.loggedIn &&
springSecurityService.principal.username == userInstance.username) {
springSecurityService.reauthenticate userInstance.username
}
flash.message = "The user was updated"
redirect action: show, id: userInstance.id
}
}
因此,原来根本不是@Secured注释,而是spring安全性实现之前遗留下来的基于会话的身份验证代码。 将正确的对象添加到会话范围后,问题就消失了
啊 但这正是问题所在,所有Spring Security helper类似乎都能识别身份验证和用户详细信息,但当用户尝试访问@Secured控制器时,它会将其返回到登录,从而创建重定向循环。正常登录工作正常,所以我必须错过一个j_spring_security_check没有的步骤。我可以,但它不会帮助任何人。该解决方案是特定于实现的,因为它是针对遗留代码的黑客攻击。我所做的所有手动身份验证工作都基于上面的内容。你是否有与我描述的问题类似的问题?是的。在grails 2.0.0和HTTPS中,在调用“重新验证”后更新了用户详细信息,但被拒绝的URL导致HTTP 310错误:重定向太多,注销无效。清除cookies可以帮助我重新登录。我使用强制注销而不是重新验证。但我想使用“重新验证”功能!