2017-07-17 4 views
0

Ich habe Ressource, Autorisierung und _ui Anwendungen geschrieben mit Spring Boot 1.5.3, OAuth2 und MongoDB.OAuth2 SSO mit Spring Boot ohne den Autorisierungsbildschirm

Auf die Ressourcen wird von mobilen Apps sowie von einigen Webanwendungen zugegriffen (eine für normale Benutzer und die andere für Administratoren). Die Apps sind den samples aus den Anleitungen von Dave Syer ziemlich ähnlich. Der Unterschied besteht darin, dass die Benutzer in der Datenbank gespeichert sind und die Clients in einer XML-Datei gespeichert sind, die sich im Ressourcenordner des Autorisierungsservers befindet.

Ich habe Probleme mit der Anmeldeerfahrung für die Webbenutzer. Wenn Sie den Anleitungen für die JWT-basierte OAuth-App folgen, wird der Benutzer nach der Anmeldeseite zum Autorisierungsbildschirm weitergeleitet, was nicht das gewünschte Verhalten ist. Ie., Ich möchte nicht, dass mein Autorisierungsserver fragt, ob der Benutzer meiner Webanwendung vertraut, um auf seine Ressourcen zuzugreifen. Stattdessen möchte ich, dass die Benutzer direkt nach dem Login auf die ui-Seiten umgeleitet werden, wie man es erwarten würde.

Ich fand this project on GitHub (sehr ähnlich zu den Anwendungen aus dem Leitfaden), die sich genau so verhält, wie ich will, aber sobald ich es durch Hinzufügen meiner Authentifizierungs- und Autorisierungsimplementierung anpassen, wird wieder auf den Autorisierungsbildschirm zurückgegriffen. Offenbar vermisse ich etwas, aber ich konnte nicht genau herausfinden, was genau ist.

Zulassung/src/main/resourcs/application.yml

security: 
    oauth2: 
    client: 
     client-id: trusted-app 
     client-secret: secret 
     scope: read, write 
     auto-approve-scopes: .* 
    authorization: 
     check-token-access: permitAll() 
server: 
    port: 9999 
    context-path: /uaa 
mongo: 
    db: 
    name: myappname 

Zulassung/src/main/resourcs/Client-details.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xmlns:oauth="http://www.springframework.org/schema/security/oauth2" 

    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans.xsd 
        http://www.springframework.org/schema/security/oauth2 
        http://www.springframework.org/schema/security/spring-security-oauth2.xsd"> 

<oauth:client-details-service id="client-details-service"> 

    <!-- Web Application clients --> 
    <oauth:client 
      client-id="trusted-app" 
      secret="secret" 
      authorized-grant-types="authorization_code, password,refresh_token" 
      authorities="ROLE_WEB, ROLE_TRUSTED_CLIENT" 
      access-token-validity="${oauth.token.access.expiresInSeconds}" 
      refresh-token-validity="${oauth.token.refresh.expiresInSeconds}"/> 
    </oauth:client-details-service> 
</beans> 

Zulassung/src /main/java/AuthorizationApplication.java

@SpringBootApplication 
@RestController 
public class AuthorizationApplication extends AuthorizationServerConfigurerAdapter { 

    @RequestMapping("/user") 
    @ResponseBody 
    public Principal user(Principal user) { 
     return user; 
    } 

    @Configuration 
    static class MvcConfig extends WebMvcConfigurerAdapter { 
     @Override 
     public void addViewControllers(ViewControllerRegistry registry) { 
      registry.addViewController("login").setViewName("login"); 
      registry.addViewController("/").setViewName("index"); 
     } 
    } 

    @Configuration 
    @Order(-20) 
    static class LoginConfig extends WebSecurityConfigurerAdapter { 
     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .formLogin().loginPage("/login").permitAll() 
      .and() 
       .requestMatchers() 
       .antMatchers("/", "/login", "/oauth/authorize", "/oauth/confirm_access") 
      .and() 
       .authorizeRequests() 
       .anyRequest().authenticated(); 
     } 
    } 

    @Configuration 
    @EnableAuthorizationServer 
    @ImportResource({"classpath*:client-details.xml"}) 
    protected static class OAuth2AuthorizationConfig extends AuthorizationServerConfigurerAdapter { 

     @Autowired 
     private AuthenticationManager authenticationManager; 

     @Resource(name="client-details-service") 
     private ClientDetailsService clientDetailsService; 

     @Override 
     public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
      clients.withClientDetails(clientDetailsService); 
     } 

     @Override 
     public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
      endpoints 
       .authenticationManager(authenticationManager) 
       .accessTokenConverter(jwtAccessTokenConverter()); 
     } 

     @Bean 
     public JwtAccessTokenConverter jwtAccessTokenConverter() { 
      JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
      return converter; 
     } 
    } 

    @Bean 
    PasswordEncoder passwordEncoder(){ 
     return new StandardPasswordEncoder(); 
    } 

    public static void main(String[] args) { 
     SpringApplication.run(AuthorizationApplication.class, args); 
    } 

} 

Zulassung/src/main/java/mypackage/UserService.java

@Service 
public class UserService implements UserDetailsService { 

    private UserAccountRepository userAccountRepository; 

    @Autowired 
    public UserService(UserAccountRepository userAccountRepository){ 
     this.userAccountRepository = userAccountRepository; 
    } 

    @Override 
    public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException { 

     UserAccount userAccount = userAccountRepository.findByEmail(s); 

     if (userAccount != null) { 
      return userAccount; 
     } else { 
      throw new UsernameNotFoundException("could not find the user '" + s + "'"); 
     } 
    } 
} 

ui/src/main/resources/application.yml

auth-server: http://localhost:9999/uaa 
server: 
    port: 8080 
spring: 
    aop: 
    proxy-target-class: true 
security: 
    oauth2: 
    client: 
     clientId: trusted-app 
     clientSecret: secret 
     access-token-uri: ${auth-server}/oauth/token 
     user-authorization-uri: ${auth-server}/oauth/authorize 
     scope: read, write 
    resource: 
     token-info-uri: ${auth-server}/oauth/check_token 

ui/src /main/java/UiApplication.java

@SpringBootApplication 
@EnableOAuth2Sso 
public class UiApplication extends WebSecurityConfigurerAdapter{ 

    public static void main(String[] args) { 
     SpringApplication.run(UiApplication.class, args); 
    } 

    @Bean 
    OAuth2RestTemplate oauth2RestTemplate(OAuth2ClientContext oauth2ClientContext, OAuth2ProtectedResourceDetails details) { 
     return new OAuth2RestTemplate(details, oauth2ClientContext); 
    } 
} 

Antwort

0

Von http://www.springframework.org/schema/security/spring-security-oauth2.xsd Element Client-Details-Service> complex client> Attribut

Scopes oder umfang Muster autoaprove, die (durch Kommas getrennt), oder nur "true" autoapproved sind alle auf AutoApprove.

Fügen Sie einfach das autoapprove="true" Attribut auf Ihren trusted-App in client-details.xml. Auf diese Weise wird der Authentifizierungsserver keine Benutzerbestätigung anfordern, um auf die Ressourcen zuzugreifen.

Here ist ein Beispiel, wie Sie dieses Verhalten direkt in Ihrer Java-Konfiguration implementieren.

Verwandte Themen