Я не могу перенаправить звонок на страницу входа в 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();
}
}