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用戶將訪問像任何其他具有相同角色的用戶一樣的資源。