将 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. ajaxSuccessUrlfailureHandler. ajaxAuthFailUrl。在问题中发布一些代码可能会有所帮助。

以上是关于将 REST 身份验证添加到 Grails + SpringSecurity 浏览器应用程序的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Grails 中使用 spring security rest 插件进行身份验证

如何处理 grails spring-security-rest 插件中的自定义身份验证异常?

Spring security rest 插件:身份验证失败,未找到 AuthenticationProvider

grails spring security rest /api/login 401 Unauthorized

将身份验证令牌添加到 Spring Data Neo4j Rest

Grails - Spring 安全 ldap 活动目录身份验证 - 凭据错误错误