我有一个Grails 2.5.3应用程序,目前使用spring安全插件进行身份验证 . 用户使用用户名/密码登录 .
我现在更新了应用以支持OAuth身份验证(使用ScribeJava) . 用户可以单击将其重定向到OAuth提供程序页面的链接,并在成功输入凭据后将其重定向回我的应用程序 . 但是,我无法将此功能与spring安全插件联系起来,以便当用户重定向回我的应用程序时(从OAuth成功登录后),我实际上可以看到他们已登录并继续使用我的所有 spring 安全的好东西,如 <sec:ifLoggedIn>
.
有谁知道这样做的方法或有一个例子,我可以看一看?
以下是我使用OAuth对用户进行身份验证的方法:
//called when user clicks "login using oauth"
def authenticate() {
OAuthService service = new ServiceBuilder()
.apiKey(grailsApplication.config.my.sso.clientid)
.apiSecret(grailsApplication.config.my.sso.clientsecret)
.build(MyApi.instance());
String url = service.getAuthorizationUrl();
return redirect(url: url)
}
//called when oauth provider redirects to my application
def authorization_code() {
def code = params.code
OAuthService service = new ServiceBuilder()
.apiKey(grailsApplication.config.my.sso.clientid)
.apiSecret(grailsApplication.config.my.sso.clientsecret)
.build(MyApi.instance());
println code
OAuth2AccessToken accessToken = service.getAccessToken(code);
String userProfileUrl = grailsApplication.config.my.sso.authdomain+"/userinfo"
final OAuthRequest request = new OAuthRequest(Verb.GET, userProfileUrl);
service.signRequest(accessToken, request);
final Response response = service.execute(request);
println(response.getCode());
println(response.getBody());
render (text: code)
}
2 回答
通过解析JSON来获取用户详细信息
在我们的案例中,我们使用电子邮件ID作为用户名 .
因此,当我们获取用户数据时,只需检查用户是否已在系统中注册,如下所示
用户注册成功后,我们只需要加载他的上下文,如下所示
加载spring安全上下文后,您可以将用户重定向到目标网页 .
现在,oauth用户将像具有相同角色的任何其他用户一样访问资源 .
无论何时通过
OAuth
进行身份验证,远程服务器每次都会返回unique id (some numeric value)
. 您可以使用id
来验证最终用户并使用springsecurity.reauthenticate()
方法对用户进行身份验证 .这样做的步骤:
当用户与服务提供商连接(首次验证)时 . 服务提供商发送给您
unique id
. 将unique id
保存在用户表中 .当用户通过该服务提供商登录时 . 服务提供商再次发送
unique id
. 检查系统中是否存在unique id
,如果用户存在该唯一ID,则使用springsecurity.reauthenticate(userInstance)
方法对用户进行身份验证 . 现在您可以使用Spring安全功能 .检查链接:http://www.jellyfishtechnologies.com/grails-2-2-0-integration-with-facebook-using-grails-oauth-plugin/