2017-11-19 2 views
-1
@RestController 
public class AuthenticationController { 

    @RequestMapping("/") 
    protected Principal login(Principal user) { 
     ObjectMapper mapper = new ObjectMapper(); 

      System.out.println(SecurityContextHolder.getContext().getAuthentication().getPrincipal()); 
      System.out.println(SecurityContextHolder.getContext().getAuthentication().getDetails()); 
      System.out.println(SecurityContextHolder.getContext().getAuthentication().getPrincipal()); 
      System.out.println("testing testing xyz"); 
     return user; 
    } 
} 

zu erhalten Dies ist mein Code. Ich habe versucht mit maximal möglichen Möglichkeiten, um Details des Benutzers zu erhalten. Eigentlich möchte ich E-Mail des Benutzers, aber wenn ich "Benutzer" - Hauptobjekt zurückgebe, gibt es JSON auf dem Bildschirm. Bitte helfen Sie mir dies auf ..Nicht in der Lage, Benutzerdetails von Principal-Objekt im Spring-Boot OAuth 2

hinzugefügt Federsicherheitskonfiguration ... Bitte gehen Sie durch und lassen Sie mich wissen, ob ich irgend etwas falsch gemacht .. und mein Umfang ist openid, E-Mail-Profil

package com.ggktech; 

import org.springframework.beans.factory.annotation.Autowired; 
import org.springframework.beans.factory.annotation.Configurable; 
import org.springframework.boot.autoconfigure.security.oauth2.resource.ResourceServerProperties; 
import org.springframework.boot.autoconfigure.security.oauth2.resource.UserInfoTokenServices; 
import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.builders.WebSecurity; 
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.oauth2.client.OAuth2ClientContext; 
import org.springframework.security.oauth2.client.OAuth2RestTemplate; 
import org.springframework.security.oauth2.client.filter.OAuth2ClientAuthenticationProcessingFilter; 
import org.springframework.security.oauth2.client.token.grant.code.AuthorizationCodeResourceDetails; 
import org.springframework.security.web.authentication.www.BasicAuthenticationFilter; 
import org.springframework.security.web.csrf.CookieCsrfTokenRepository; 

/** 
* Modifying or overriding the default spring boot security. 
*/ 
@Configurable 
@EnableWebSecurity 
public class OAuthSecurityConfig extends WebSecurityConfigurerAdapter { 

    private OAuth2ClientContext oauth2ClientContext; 
    private AuthorizationCodeResourceDetails authorizationCodeResourceDetails; 
    private ResourceServerProperties resourceServerProperties; 

    @Autowired 
    public void setOauth2ClientContext(OAuth2ClientContext oauth2ClientContext) { 
     this.oauth2ClientContext = oauth2ClientContext; 
    } 

    @Autowired 
    public void setAuthorizationCodeResourceDetails(AuthorizationCodeResourceDetails authorizationCodeResourceDetails) { 
     this.authorizationCodeResourceDetails = authorizationCodeResourceDetails; 
    } 

    @Autowired 
    public void setResourceServerProperties(ResourceServerProperties resourceServerProperties) { 
     this.resourceServerProperties = resourceServerProperties; 
    } 

    /* This method is for overriding the default AuthenticationManagerBuilder. 
    We can specify how the user details are kept in the application. It may 
    be in a database, LDAP or in memory.*/ 
    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     super.configure(auth); 
    } 

    /* This method is for overriding some configuration of the WebSecurity 
    If you want to ignore some request or request patterns then you can 
    specify that inside this method.*/ 
    @Override 
    public void configure(WebSecurity web) throws Exception { 
     super.configure(web); 
    } 

    /*This method is used for override HttpSecurity of the web Application. 
    We can specify our authorization criteria inside this method.*/ 
    @Override 
    protected void configure(HttpSecurity http) throws Exception { 

     http 
       // Starts authorizing configurations. 
       .authorizeRequests() 
       // Ignore the "/" and "/index.html" 
       .antMatchers("/", "/**.html", "/**.js").permitAll() 
       // Authenticate all remaining URLs. 
       .anyRequest().fullyAuthenticated() 
       .and() 
       // Setting the logout URL "/logout" - default logout URL. 
       .logout() 
       // After successful logout the application will redirect to "/" path. 
       .logoutSuccessUrl("/") 
       .permitAll() 
       .and() 
       // Setting the filter for the URL "/google/login". 
       .addFilterAt(filter(), BasicAuthenticationFilter.class) 
       .csrf() 
       .csrfTokenRepository(CookieCsrfTokenRepository.withHttpOnlyFalse()); 
    } 

    /*This method for creating filter for OAuth authentication.*/ 
    private OAuth2ClientAuthenticationProcessingFilter filter() { 
     //Creating the filter for "/google/login" url 
     OAuth2ClientAuthenticationProcessingFilter oAuth2Filter = new OAuth2ClientAuthenticationProcessingFilter(
       "/login"); 

     //Creating the rest template for getting connected with OAuth service. 
     //The configuration parameters will inject while creating the bean. 
     OAuth2RestTemplate oAuth2RestTemplate = new OAuth2RestTemplate(authorizationCodeResourceDetails, 
       oauth2ClientContext); 
     oAuth2Filter.setRestTemplate(oAuth2RestTemplate); 

     // Setting the token service. It will help for getting the token and 
     // user details from the OAuth Service. 
     oAuth2Filter.setTokenServices(new UserInfoTokenServices(resourceServerProperties.getUserInfoUri(), 
       resourceServerProperties.getClientId())); 

     return oAuth2Filter; 
    } 
} 
+0

Bitte geben Sie die richtige Detail über Ihre Konfiguration nützlich sein. Zeigen Sie Ihre Feder Sicherheitskonfiguration mit oAuth – Hiren

+0

Fertig, einmal durchlaufen – Dev

Antwort

-1

Ihre Methode ist ein REST-Endpunkt, was bedeutet, dass die Parameter, die zu dieser Funktion gehören, serialisierte Daten sind. Sie müssen es deserialisieren und die erforderlichen Daten daraus abrufen. Der Parameter dieser Funktion kann nicht in Priciple eingegeben werden. Von wo Sie gesendet haben, müssen Sie ihn wahrscheinlich in byte[] senden. Dann müssen Sie byte[] in String konvertieren, was ein JSON ist. Dann mit Jackson Bibliothek müssen Sie Ihre user füllen. Danach können Sie die E-Mail des Benutzers erhalten.

@RequestMapping("/") 
protected Principal login(byte[] data) { 
    String inputJSONString = new String(data); 
    ObjectMapper mapper = new ObjectMapper(); 
    Principle user = objectMapper.readValue(inputJSONString, Principle.class); 
    //Now you have a setted user object and you can get user's mail from a method like getMail() 
    user.getMail(); 

    System.out.println(SecurityContextHolder.getContext().getAuthentication().getPrincipal()); 
    System.out.println(SecurityContextHolder.getContext().getAuthentication().getDetails()); 
    System.out.println(SecurityContextHolder.getContext().getAuthentication().getPrincipal(
    System.out.println("testing testing xyz"); 
    return user; 
} 
+0

Hallo, vielen Dank für Ihre Antwort. Ich erhalte Kompilierungsfehler. Als "Benutzer" -> Prinzipal ist Rückgabetyp und Was ist 'Benutzer Benutzer 'in der gegebenen Lösung – Dev

+0

Ich nehme an, dass die Klasse" Principle "der Typ Ihres Benutzers ist. Ich habe die Lösung korrigiert. Könntest du es nochmal versuchen? –

+0

Sie sind missverstanden ... Prinzipal ist Frühling Sicherheitsklasse und Problem wird Hauptdetail von Frühling Sicherheit cotext – Hiren

0

Das Problem ist, Sie haben nicht konfigurieren Sie Ihre AuthenticationManager in Ihrem Code Sie dieses @Override protected void configure(AuthenticationManagerBuilder auth) throws Exception { super.configure(auth); }

Authentication Manager getan haben:

versucht den übergebenen Authentifizierungs Objekt zu authentifizieren, eine voll bestückte Rückkehr Authentifizierungsobjekt (einschließlich erteilter Berechtigungen) bei Erfolg.

Für einfach im Speicher Authentication Manager können Sie so etwas tun;

@Autowired 
public void configure(AuthenticationManagerBuilder auth) 
     throws Exception { 
    auth.inMemoryAuthentication().withUser("user").password("password") 
      .roles("USER").and().withUser("hiren").password("hiren") 
      .roles("ADMIN"); 
} 

Danach können Sie Principal Objekt nach erfolgreicher Authentifizierung des Benutzers erhalten. Sie können auch Ihre eigenen Authentifizierungs-Provider wie folgt konfiguriert werden:

@Override 
protected void configure(
    AuthenticationManagerBuilder auth) throws Exception { 

    auth.authenticationProvider(customeAuthenticationProvider); 
} 

this Link wird für Authentifizierungsanbieter Konfiguration