8

我有一个Grails 2.5.3应用程序,目前使用Spring安全插件进行身份验证。用户使用用户名/密码登录。如何将OAuth身份验证与Spring安全联系起来

我已经更新了应用程序以支持OAuth身份验证(使用ScribeJava)。用户可以单击将其重定向到OAuth提供商页面的链接,并在成功输入凭据后将其重定向回我的应用程序。然而,我还没有能够将此功能与Spring安全插件绑定,以便当用户重定向到我的应用(在成功从OAuth登录后)后,我实际上可以看到他们已经登录并继续使用我的所有弹簧安全的好东西,如<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) 
} 
+1

以下任何答案对您有帮助吗? –

回答

1

当你通过认证OAuth,你unique id (some numeric value)每次远程服务器的回报。 您可以使用该id来验证您的用户,并使用springsecurity.reauthenticate()方法验证用户身份。

步骤来做到这一点:

  1. 当用户连接(验证第一次)与服务提供商。 服务提供商发送给您unique id。将unique id保存在 用户表中。
  2. 并且当用户通过该服务提供商登录时。服务提供商 再次发送unique id。检查您的系统中是否存在unique id, 以及用户是否存在该唯一ID,然后使用 springsecurity.reauthenticate(userInstance)方法对用户进行身份验证。现在你可以使用弹簧安全功能。

退房链接:http://www.jellyfishtechnologies.com/grails-2-2-0-integration-with-facebook-using-grails-oauth-plugin/

0

假设你从端Oauth提供商用户的详细信息,你只需要 设置特定用户的安全上下文

只要得到用户的详细信息通过解析JSON如

def oauthResponse = JSON.parse(response?.getBody()) 
Map data = [ 
        id   : oauthResponse.id, 
        email  : oauthResponse.email, 
        name  : oauthResponse.name, 
        first_name : oauthResponse.given_name, 
        last_name : oauthResponse.family_name, 
        gender  : oauthResponse.gender, 
        link  : oauthResponse.link 
      ] 

我们在我们的例子中,我们使用电子邮件ID作为用户名。

所以,当我们得到的用户数据只是检查用户是否已经与系统或登记不喜欢下面

//load the user details service bean 
def userDetailsService 

//check if user is already registered on our system 
User user = User.findByEmail(data?.email) 
if (user) { 

    //If user exists load his context 
    userDetails = userDetailsService.loadUserByUsername(data?.email) 
} else { 

    //create the new user 
    //Assign the role to it 

    //load his context as below 
    userDetails = userDetailsService.loadUserByUsername(data?.email) 
} 

用户注册成功后,我们只需要加载他的背景像下面

def password 

//setting spring security context 
SecurityContextHolder.getContext().setAuthentication(new UsernamePasswordAuthenticationToken(userDetails, password == null ? userDetails.getPassword() : password, userDetails.getAuthorities())) 

加载弹簧安全上下文后,您可以将用户重定向到目标页面。

现在,oauth用户将访问像任何其他具有相同角色的用户一样的资源。