将 REST 身份验证添加到 Grails + SpringSecurity 浏览器应用程序
Posted
技术标签:
【中文标题】将 REST 身份验证添加到 Grails + SpringSecurity 浏览器应用程序【英文标题】:Adding REST authentication to Grails + SpringSecurity browser app 【发布时间】:2012-12-13 19:21:58 【问题描述】:我在 STS 3.1 中有一个 Grails 应用程序,在 UrlMappings.groovy 和一组控制器中布置了一个 REST API。我安装了 SpringSecurity 的东西,所以我有 Login/Logout 控制器和 RegistrationCodeController 等。我一直在使用浏览器界面登录,但我需要从 REST 客户端开始登录。
我需要使用哪些具体的 url 和请求来注册/登录/检查登录/注销?
我已经能够通过将 j_username 和 j_password 发布到 /j_spring_security_check 来登录。但是,如果我首先发出一个未通过身份验证的请求,那么 POST 到 /j_spring_security_check 会自动返回初始失败请求的结果。我需要一种登录方式,它总是返回成功/错误状态和成功时的 User.id。
【问题讨论】:
【参考方案1】:在 Config.groovy 中,插入一些配置项:
grails.plugins.springsecurity.successHandler.alwaysUseDefault = true
grails.plugins.springsecurity.successHandler.defaultTargetUrl = "/rest/success"
grails.plugins.springsecurity.failureHandler.defaultFailureUrl = "/rest/failed"
这将强制将成功登录重定向到 /rest/success。然后在这个方法中,返回user.id:
import grails.converters.JSON
class RestController
def springSecurityService
def success()
def response = ['status':'success', 'id':springSecurityService.currentUser.id]
render response as JSON
def failed()
def response = ['status': 'failed']
render response as JSON
【讨论】:
我明白为什么这应该有效。不幸的是,当我第一次请求需要身份验证的控制器,然后我 POST 到 /j_spring_security_check 时,我仍然被重定向到第一个请求的响应。我应该通过其他请求登录而不是 POST 到 /j_spring_security_check 吗? 我认为发布到它很好,因为原始身份验证登录表单具有相同的内容。是否适用于网页直接登录场景? defaultTargetUrl 重定向适用于网页登录,但不适用于来自我的休息客户端的 POST。 该请求是 Ajax 请求吗?然后你应该定义successHandler. ajaxSuccessUrl
和failureHandler. ajaxAuthFailUrl
。在问题中发布一些代码可能会有所帮助。以上是关于将 REST 身份验证添加到 Grails + SpringSecurity 浏览器应用程序的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Grails 中使用 spring security rest 插件进行身份验证
如何处理 grails spring-security-rest 插件中的自定义身份验证异常?
Spring security rest 插件:身份验证失败,未找到 AuthenticationProvider
grails spring security rest /api/login 401 Unauthorized