Spring Boot: для доступа к этому ресурсу в OAUTH2 требуется полная аутентификация - PullRequest
0 голосов
/ 30 апреля 2018

Я не могу перенаправить звонок на страницу входа в Spring. В то время как внутренний вызов перенаправления приводит меня к http://localhost:8081/auth/login, но при этом я получаю ошибку ниже для / login

<oauth>
<error_description>
Full authentication is required to access this resource
</error_description>
<error>unauthorized</error>
</oauth>

моя сторона клиента работает на 8082, а сторона сервера - на 8081, когда я нажму http://localhost:8082/ui/ это берет меня через перенаправление

http://localhost:8081/auth/oauth/authorize?client_id=ClientId&redirect_uri=http://localhost:8082/ui/login&response_type=code&state=ydLRdw

но после этого перенаправления выдает ошибку, так как «Для доступа к этому ресурсу требуется полная аутентификация "на http://localhost:8081/auth/login

Предполагалось предоставить страницу входа для проверки учетных данных пользователя, а затем разрешить / запретить запрос. Не уверен, что я делаю не так. Любая помощь будет принята с благодарностью.

Мой клиентский конфиг

@EnableOAuth2Sso
@Configuration
@EnableWebSecurity

public class OauthConfig extends WebSecurityConfigurerAdapter {

     @Autowired
        private OAuth2ClientContextFilter oauth2ClientContextFilter;



    @Override
    protected void configure(HttpSecurity http) throws Exception {
        // TODO Auto-generated method stub
        /*http.antMatcher("/**").
        authorizeRequests().antMatchers("/","/login**").permitAll().anyRequest().authenticated();*/
         /*http    
         .authorizeRequests().anyRequest().authenticated();*/

        http.antMatcher("/**")
        .authorizeRequests()
        .antMatchers("/", "/login**")//.hasRole("USER").anyRequest()


        .permitAll()
        .anyRequest()
        .authenticated()
        .and()
        .httpBasic().and()

       .addFilterAfter(oauth2ClientContextFilter, SecurityContextPersistenceFilter.class);

    }



      public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {

            security.allowFormAuthenticationForClients();
        }

}

webconfig на стороне клиента

@SuppressWarnings("deprecation")
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        // TODO Auto-generated method stub
         configurer.enable();
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        // TODO Auto-generated method stub
        super.addViewControllers(registry);
        registry.addViewController("/").setViewName("forward:/index");
        registry.addViewController("/index");
        registry.addViewController("/secure");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // TODO Auto-generated method stub
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Bean
    public  static PropertySourcesPlaceholderConfigurer placeHolderConfigurer()
    {
        return new PropertySourcesPlaceholderConfigurer();
    }

    @Bean
    public RequestContextListener contextlist() 
    {
        return new RequestContextListener();
    }

    @Bean
    public static PropertySourcesPlaceholderConfigurer placeholderConfigurer() {
        return new PropertySourcesPlaceholderConfigurer();
    }

}

контроллер на стороне клиента

@Controller
public class BasicController {
    @GetMapping
      public String index() {
        return "index";
      }

      @GetMapping("/secure")
      public String secure() {
        return "secure";
      }
}

application.yml

 server:
  port: 8082
  servlet:
    context-path: /ui
  session: 
    cookieName: UISESSION

 security:
   oauth2: 
    client: 
      client-id: ClientId
      clientSecret: secret
      accessTokenUri: http://localhost:8081/auth/oauth/token
      userAuthorizationUri: http://localhost:8081/auth/oauth/authorize
    resource: 
      userInfoUri: http://localhost:8081/auth/rest/hello/principal
      preferTokenInfo: false

application.properties

spring.thymeleaf.cache= false
spring.mvc.view.prefix=/
spring.mvc.view.suffix=.html

spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.security.SecurityAutoConfiguration

server.port= 8082
server.servlet.session.cookie.name=UISESSION

management.endpoints.web.expose=*

мой index.html для начальной домашней страницы приложения

<body>

    <h1>Spring Security OAuth Example</h1>

    <a href="secure">Login to OAuth here</a>

</body>

Конфигурация на моем сервере

Сервер авторизации

@Configuration
@EnableAuthorizationServer
public class AuthorisationServerConfig extends AuthorizationServerConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager;





    @Override
    public void configure(AuthorizationServerSecurityConfigurer security) throws Exception {
        // TODO Auto-generated method stub
        security.allowFormAuthenticationForClients();
        security.tokenKeyAccess("permitAll()")
        .checkTokenAccess("isAuthenticated()");

    }

    @Override
    public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
        // TODO Auto-generated method stub
        clients.inMemory().withClient("ClientId")//.authorities("ROLE_ADMIN")
        .secret("{noop}secret")
        .authorizedGrantTypes("authorization_code").scopes("user_info").autoApprove(true);
    }

    @Override
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        // TODO Auto-generated method stub
        endpoints.authenticationManager(authenticationManager);
    }



}

Сервер ресурсов

@EnableResourceServer
@Configuration
@Order(1000)    
public class ResourceServerConfig  extends WebSecurityConfigurerAdapter {

    @Autowired
    private AuthenticationManager authenticationManager; 
    @Autowired

    private  UserDetailsService customUserDetailsService;

    @Autowired
      public ResourceServerConfig(AuthenticationManager authenticationManager, 
              CustomUserDetailsService customUserDetailsService) {
        this.authenticationManager = authenticationManager;
        this.customUserDetailsService = customUserDetailsService;
      }


    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.requestMatchers().antMatchers("/login","/oauth/authorize").and().authorizeRequests()
        .anyRequest().fullyAuthenticated().and().formLogin().permitAll();//.and().csrf().disable();
        http.httpBasic();
        http.csrf().disable();

    }

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception {
        // TODO Auto-generated method stub

        auth.parentAuthenticationManager(authenticationManager).
        userDetailsService(customUserDetailsService);
        //userDetailsService(customUserDetailsService).passwordEncoder(userPasswordEncoder);
    }   

}

И сервис

@Service
public class CustomUserDetailsService implements UserDetailsService{

    @Autowired
    private UserRepository userRepository;

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
        // TODO Auto-generated method stub
        Optional<Users> userOptional= userRepository.findByName(username);
        userOptional.orElseThrow(() -> new UsernameNotFoundException("user not found"));
        return userOptional.map(users -> new CustomUserDetails(users)).get();
    }


}
...