angularjs - স্প্রিং-বুট এবং অ্যাঙ্গুলারগুলি সহ কর্নার কাজ করছে না




rest spring-mvc (8)

আপনার @Eableable ওয়েবসিকিউরিটি ক্লাসে ওয়েবসিকিউরিটি কনফিগুরির অ্যাডাপ্টার ক্লাস এবং ওভাররাইডিং কনফিগারেশন () পদ্ধতিটি বাড়ানো কাজ করবে: নীচে নমুনা শ্রেণি রয়েছে

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

         http
        .csrf().disable()
        .exceptionHandling();
         http.headers().cacheControl();

        @Override
        public CorsConfiguration getCorsConfiguration(final HttpServletRequest request) {
            return new CorsConfiguration().applyPermitDefaultValues();
        }
    });
   }
}

আমি অন্য অ্যাপ্লিকেশন (অ্যাংুলারজ) থেকে একটি অ্যাপ্লিকেশনটিতে (স্প্রিং-বুট অ্যাপ্লিকেশন) আরআরএসটি এন্ডপয়েন্টগুলি কল করার চেষ্টা করছি। অ্যাপ্লিকেশনগুলি নিম্নলিখিত হোস্ট এবং পোর্টগুলিতে চলছে।

  • স্প্রিং বুট ব্যবহার করে REST অ্যাপ্লিকেশন, http://localhost:8080
  • এইচটিএমএল অ্যাপ্লিকেশন, কৌণিকুল ব্যবহার করে, http://localhost:50029

আমি স্প্রিং-বুট অ্যাপ্লিকেশন সহ স্প্রিং-সুরক্ষাও ব্যবহার করছি। এইচটিএমএল অ্যাপ্লিকেশন থেকে, আমি আরইএসটি অ্যাপ্লিকেশনটিতে প্রমাণীকরণ করতে পারি, তবে, এরপরেও আমি কোনও আরইএসটি শেষ পয়েন্টটি অ্যাক্সেস করতে পারি না। উদাহরণস্বরূপ, আমি নীচে হিসাবে সংজ্ঞায়িত একটি কৌণিক সেবা আছে।

adminServices.factory('AdminService', ['$resource', '$http', 'conf', function($resource, $http, conf) {
    var s = {};
    s.isAdminLoggedIn = function(data) {
        return $http({
            method: 'GET',
            url: 'http://localhost:8080/api/admin/isloggedin',
            withCredentials: true,
            headers: {
                'X-Requested-With': 'XMLHttpRequest'
            }
        });
    };
    s.login = function(username, password) {
        var u = 'username=' + encodeURI(username);
        var p = 'password=' + encodeURI(password);
        var r = 'remember_me=1';
        var data = u + '&' + p + '&' + r;

        return $http({
            method: 'POST',
            url: 'http://localhost:8080/login',
            data: data,
            headers: {'Content-Type': 'application/x-www-form-urlencoded'}
        });
    };
    return s;
}]);

কৌণিক নিয়ন্ত্রক নীচের মত দেখাচ্ছে।

adminControllers.controller('LoginController', ['$scope', '$http', 'AdminService', function($scope, $http, AdminService) {
    $scope.username = '';
    $scope.password = '';

    $scope.signIn = function() {
        AdminService.login($scope.username, $scope.password)
            .success(function(d,s) {
                if(d['success']) {
                    console.log('ok authenticated, call another REST endpoint');
                    AdminService.isAdminLoggedIn()
                        .success(function(d,s) {
                            console.log('i can access a protected REST endpoint after logging in');
                        })
                        .error(function(d, s) { 
                            console.log('huh, error checking to see if admin is logged in');
                            $scope.reset();
                        });
                } else {
                    console.log('bad credentials?');
                }
            })
            .error(function(d, s) {
                console.log('huh, error happened!');
            });
    };
}]);

http://localhost:8080/api/admin/isloggedin আমি একটি 401 Unauthorized পেয়েছি।

রেস্ট অ্যাপ্লিকেশন দিকে, আমার কাছে একটি সিওআরএস ফিল্টার রয়েছে যা নীচের মত দেখাচ্ছে।

@Component
@Order(Ordered.HIGHEST_PRECEDENCE)
public class CORSFilter implements Filter {

    @Override
    public void destroy() { }

    @Override
    public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
            throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) res;
        HttpServletRequest request = (HttpServletRequest) req;

        response.setHeader("Access-Control-Allow-Origin", "http://localhost:50029");
        response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", "X-Requested-With, X-Auth-Token");
        response.setHeader("Access-Control-Allow-Credentials", "true");

        if(!"OPTIONS".equalsIgnoreCase(request.getMethod())) {
            chain.doFilter(req, res);
        }
    }

    @Override
    public void init(FilterConfig config) throws ServletException { }
}

আমার বসন্ত সুরক্ষা কনফিগারেশন নীচের মত দেখাচ্ছে।

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private RestAuthenticationEntryPoint restAuthenticationEntryPoint;

    @Autowired
    private JsonAuthSuccessHandler jsonAuthSuccessHandler;

    @Autowired
    private JsonAuthFailureHandler jsonAuthFailureHandler;

    @Autowired
    private JsonLogoutSuccessHandler jsonLogoutSuccessHandler;

    @Autowired
    private AuthenticationProvider authenticationProvider;

    @Autowired
    private UserDetailsService userDetailsService;

    @Autowired
    private PersistentTokenRepository persistentTokenRepository;

    @Value("${rememberme.key}")
    private String rememberMeKey;

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .csrf().disable()
            .exceptionHandling()
            .authenticationEntryPoint(restAuthenticationEntryPoint)
                .and()
            .authorizeRequests()
                .antMatchers("/api/admin/**").hasRole("ADMIN")
                .antMatchers("/", "/admin", "/css/**", "/js/**", "/fonts/**", "/api/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .successHandler(jsonAuthSuccessHandler)
                .failureHandler(jsonAuthFailureHandler)
                .permitAll()
                .and()
            .logout()
                .deleteCookies("remember-me", "JSESSIONID")
                .logoutSuccessHandler(jsonLogoutSuccessHandler)
                .permitAll()
                .and()
            .rememberMe()
                .userDetailsService(userDetailsService)
                .tokenRepository(persistentTokenRepository)
                .rememberMeCookieName("REMEMBER_ME")
                .rememberMeParameter("remember_me")
                .tokenValiditySeconds(1209600)
                .useSecureCookie(false)
                .key(rememberMeKey);
    }

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth
            .authenticationProvider(authenticationProvider);
    }
}

সমস্ত হ্যান্ডলাররা যা করছে JSON প্রতিক্রিয়া লিখে ফেলছে {success: true} the এর উপর ভিত্তি করে যদি ব্যবহারকারী লগ ইন করে, প্রমাণীকরণ করতে ব্যর্থ হয় বা লগ আউট হয়। RestAuthenticationEntryPoint নীচের মত দেখাচ্ছে।

@Component
public class RestAuthenticationEntryPoint implements AuthenticationEntryPoint {

    @Override
    public void commence(HttpServletRequest req, HttpServletResponse resp, AuthenticationException ex)
            throws IOException, ServletException {
        resp.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized");
    }

}

আমি যা মিস করছি বা ভুল করছি তার কোনও ধারণা?


আপনি যদি ফিল্টার ব্যবহার না করে বা কনফিগার ফাইল ছাড়াই CORS সক্ষম করতে চান তবে কেবল যুক্ত করুন

@CrossOrigin

আপনার নিয়ামকের শীর্ষে এবং এটি কাজ করে।


আমি spring boot 2.1.0 ব্যবহার করছি এবং আমার জন্য যা কাজ করেছে তা হ'ল

উ: এর দ্বারা কর্স ম্যাপিং যুক্ত করুন:

@Configuration
public class Config implements WebMvcConfigurer {
    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**").allowedOrigins("*");
    }
}

বি বসন্ত সুরক্ষার জন্য নীচে আমার HttpSecurity কনফিগারেশন যুক্ত করুন

.cors().configurationSource(new CorsConfigurationSource() {

    @Override
    public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
        CorsConfiguration config = new CorsConfiguration();
        config.setAllowedHeaders(Collections.singletonList("*"));
        config.setAllowedMethods(Collections.singletonList("*"));
        config.addAllowedOrigin("*");
        config.setAllowCredentials(true);
        return config;
    }
})

এছাড়াও একটি জিউল প্রক্সি ক্ষেত্রে আপনি এ এবং বি এর এই ইনস্টলড ব্যবহার করতে পারেন HttpSecurity.cors() স্প্রিং HttpSecurity.cors() এটি সক্ষম করতে কেবল HttpSecurity.cors() ব্যবহার করুন):

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("HEAD");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("DELETE");
    config.addAllowedMethod("PATCH");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

আমি একই পরিস্থিতিতে ছিল। গবেষণা এবং পরীক্ষা করার পরে, আমার অনুসন্ধানগুলি এখানে:

  1. স্প্রিং বুটের সাথে, গ্লোবাল সিওআরএস সক্ষম করার প্রস্তাবিত @CrossOrigin স্প্রিং @CrossOrigin মধ্যে ঘোষণা করা এবং সূক্ষ্ম দানাযুক্ত @CrossOrigin কনফিগারেশনের সাথে একত্রিত:

    @Configuration
    public class CorsConfig {
    
        @Bean
        public WebMvcConfigurer corsConfigurer() {
            return new WebMvcConfigurerAdapter() {
                @Override
                public void addCorsMappings(CorsRegistry registry) {
                    registry.addMapping("/**").allowedMethods("GET", "POST", "PUT", "DELETE").allowedOrigins("*")
                            .allowedHeaders("*");
                }
            };
        }
    }
  2. এখন, যেহেতু আপনি স্প্রিং সিকিউরিটি ব্যবহার করছেন, আপনাকে স্প্রিং সিকিউরিটি স্তরে সিওআরএস সক্ষম করতে হবে এবং পাশাপাশি এটি স্প্রিং এমভিসি স্তরে সংজ্ঞায়িত কনফিগারেশনটি উত্তোলনের অনুমতি দিতে হবে:

    @EnableWebSecurity
    public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    
        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.cors().and()...
        }
    }

    স্প্রিং এমভিসি ফ্রেমওয়ার্কে সিওআরএস সমর্থন ব্যাখ্যা করার জন্য Here খুব দুর্দান্ত টিউটোরিয়াল রয়েছে।


এটি আমার পক্ষে কাজ করে:

@Configuration
public class MyConfig extends WebSecurityConfigurerAdapter  {
   //...
   @Override
   protected void configure(HttpSecurity http) throws Exception {

       //...         

       http.cors().configurationSource(new CorsConfigurationSource() {

        @Override
        public CorsConfiguration getCorsConfiguration(HttpServletRequest request) {
            CorsConfiguration config = new CorsConfiguration();
            config.setAllowedHeaders(Collections.singletonList("*"));
            config.setAllowedMethods(Collections.singletonList("*"));
            config.addAllowedOrigin("*");
            config.setAllowCredentials(true);
            return config;
        }
      });

      //...

   }

   //...

}

এটি পরীক্ষা করুন:

@Override
protected void configure(HttpSecurity httpSecurity) throws Exception {
    ...
            .antMatchers(HttpMethod.OPTIONS, "/**").permitAll()
    ...
}

যদি মূলত আপনার প্রোগ্রামটি বসন্ত সুরক্ষা ব্যবহার না করে এবং কোড পরিবর্তনের পক্ষে সামর্থ্য না করে, একটি সাধারণ বিপরীত প্রক্সি তৈরি করা কৌশলটি করতে পারে। আমার ক্ষেত্রে, আমি নিম্নলিখিত কনফিগারেশন সহ এনগিনেক্স ব্যবহার করেছি:

http {
  server {
    listen 9090;
    location / {
      if ($request_method = 'OPTIONS') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      #
      # Custom headers and headers various browsers *should* be OK with but aren't
      #
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      #
      # Tell client that this pre-flight info is valid for 20 days
      #
      add_header 'Access-Control-Max-Age' 1728000;
      add_header 'Content-Type' 'text/plain; charset=utf-8';
      add_header 'Content-Length' 0;
      return 204;
      }
      if ($request_method = 'POST') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
      }
      if ($request_method = 'GET') {
      add_header 'Access-Control-Allow-Origin' '*';
      add_header 'Access-Control-Allow-Methods' 'GET, POST, OPTIONS';
      add_header 'Access-Control-Allow-Headers' 'DNT,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Range';
      add_header 'Access-Control-Expose-Headers' 'Content-Length,Content-Range';
      }

      proxy_pass http://localhost:8080;
    }
  }
}

আমার প্রোগ্রাম শোনে : 8080

রেফ: সিএনএস এনজিঙ্ক্সে C


import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

@Component
public class SimpleCORSFilter implements Filter {

private final Logger log = LoggerFactory.getLogger(SimpleCORSFilter.class);

public SimpleCORSFilter() {
    log.info("SimpleCORSFilter init");
}

@Override
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {

    HttpServletRequest request = (HttpServletRequest) req;
    HttpServletResponse response = (HttpServletResponse) res;

    response.setHeader("Access-Control-Allow-Origin", request.getHeader("Origin"));
    response.setHeader("Access-Control-Allow-Credentials", "true");
    response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
    response.setHeader("Access-Control-Max-Age", "3600");
    response.setHeader("Access-Control-Allow-Headers", "Content-Type, Accept, X-Requested-With, remember-me");

    chain.doFilter(req, res);
}

@Override
public void init(FilterConfig filterConfig) {
}

@Override
public void destroy() {
}

}

অতিরিক্ত ফিল্টার সংজ্ঞায়িত করার দরকার নেই কেবল এই ক্লাসটি যুক্ত করুন। স্প্রিং আপনার জন্য স্ক্যান করে এটি যুক্ত করা হবে। SimpleCORSFilter। এখানে উদাহরণ: spring-enable-cors





cors