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


87

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

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

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

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}উপর ভিত্তি করে যদি ব্যবহারকারী লগইন হয়েছে, প্রমাণীকরণ করতে ব্যর্থ হয়েছে বা লগ আউট করেছে। 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");
    }

}

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


আমি মনে করি আপনাকেও একটি টোকেন বা অন্য কোনও কিছুর মতো প্রমাণীকরণও বহন করতে হবে। আপনার কাছে 2 টি সার্ভার রয়েছে। আপনি কি সেই টিউটোরিয়ালটি দেখেছেন? spring.io/guides/tutorials/spring-security-and-angular-js
Gokhan ডাহা মিথ্যা কথা

@ গোখানোওনার আমি কীভাবে প্রমাণীকরণটি বহন করব? এটাই সম্ভবত এই সমস্যার জন্য অনুপস্থিত অংশ। এছাড়াও, হ্যাঁ, আমি এই টিউটোরিয়ালগুলি দিয়েছিলাম এবং তারা আমার পদ্ধতির সাথে একত্রিত হয়েছিল বলে মনে করি না। প্রথম দুটি অংশ এইচটিপি-বেসিক প্রমাণীকরণের সাথে ডিল করেছিল, তারপরে তৃতীয় অংশ রেডিসের সাথে ডিল করেছিল (আমি এটি নির্ভরতা হিসাবে পেতে চাইনি বা পরিকল্পনা করিনি), এবং তারপরে শেষ টিউটোরিয়ালটি API Gatewayবসন্ত মেঘের সাথে ছিল , যা আমি ভেবেছিলাম ওভারকিল ।
জেন ওয়েন

আমি মনে করি আপনি redis ছাড়া এটি করতে পারেন, এটি কেবল একটি মূল-মূল্যের ক্যাশে স্টোর। আপনাকে কোনও দোকানে প্রমাণীকরণ এবং সিএসআরএফ টোকেন সংরক্ষণ করতে হবে, ফ্লাইয়ের ভিতরে ম্যাপের অভ্যন্তরে সম্ভব। এখানে মূল জিনিসটি প্রমাণীকরণ কী। উদাহরণ তাকান: github.com/dsyer/spring-security-angular/tree/master/… এবং "সংস্থান সার্ভার" সহ পৃষ্ঠাটি। আপনি কিছু অতিরিক্ত মটরশুটি সংজ্ঞায়িত দেখতে পাবেন, সিওআরএস ফিল্টারের ক্রমও গুরুত্বপূর্ণ। এবং কিছু প্রোপ। পরিবর্তনগুলিও প্রয়োজনীয়।
গোখন ওনার

ঠিক আছে, আমি একটি দ্রুত গবেষণা করেছি। আপনার যা দরকার তা, Redis পরিত্রাণ পেতে, একটি springSessionRepositoryFilter শিম, তাকান বাক্স হয় github.com/spring-projects/spring-session/blob/1.0.0.RC1/... , এবং এছাড়াও sessionRepository শিম এবং এই শিম এ, রেডিস্পেরেশনসেশন রিপোসিটোরির পরিবর্তে, আপনি ম্যাপসেশনরেপোজিটরি ব্যবহার করতে পারেন যা বসন্ত-সেশনেও রয়েছে। এবং তারপরে উদাহরণ অনুসরণ করুন।
গোখন ওনার

উত্তর:


104
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() {
}

}

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


কিছু প্রশ্ন. 1) আমার স্ট্রিং কনস্ট্যান্টগুলি কোথায় রাখার কথা HEADERSএবং X_REDIRECT_LOCATION_HEADER? 2) লাইনটি কি request.getRequestURL());টাইপো বা অনুলিপি / পেস্ট করার ভুল? 3) আপনি কেন OPTIONSফিল্টার চেইনটি অনুসন্ধান করেন না এবং চালিয়ে যান না?
জেন ওয়েন

4
তবে এটি প্রমাণীকরণের
এন্ট্রিপয়েন্টটি

4
আপনাকে অনেক ধন্যবাদ, এটি বসন্ত এবং আম্বরকে এক সাথে কাজ করার জন্য আমার সংগ্রামে দুর্দান্তভাবে সহায়তা করেছিল। চিয়ারস সাথী!
টমাসজ সিজমানেক

ফাইন্ডব্যাগগুলি এর সাথে শিরোনামের প্যারামিটারটি সেট করা পছন্দ করে না: request.getHeader("Origin")উপরে যেমন HTTP প্রতিক্রিয়া বিভক্ত
গ্লেন

4
যদি আপনার অ্যাপ্লিকেশনটিতে অন্য ফিল্টার থাকে তবে ফিল্টারটি দিয়ে বয়ান দিয়ে এই ফিল্টারটি সর্বাধিক অগ্রাধিকারের প্রয়োজন @Order(Ordered.HIGHEST_PRECEDENCE)
শফিউল

44

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

  1. স্প্রিং বুট সহ, গ্লোবাল সিওআরএস সক্ষম করার প্রস্তাবিত উপায় হ'ল স্প্রিং এমভিসির মধ্যে ঘোষণা করা এবং সূক্ষ্ম-দানযুক্ত @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()...
        }
    }
    

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


4
আপগুলি এই পরিবর্তনের সাথে কাজ করে http .csrf ()। ডিসাইবল () .কর্স () .আর ()
মার্টি_

4
@ অসগক্স এটি শুনে ভাল লাগল :) যেহেতু আমি জেডাব্লুটিটি অনুমোদনের জন্য ব্যবহার করছি এবং তারা সিএসআরএফ নিরাপদ, আমি সেখানে রাখিনি .. এটি যদি সহায়তা করে তবে উজ্জীবিত করতে ভুলবেন না :)
যোগেন রাই

হ্যাঁ আমি +1 = ডি
মার্টি_

@ মার্সেল আপনি কি সমস্যা পাচ্ছেন?
যোগেন রাই

<আমার বিশ্রাম ঠিকানা> লোড করতে ব্যর্থ: প্রিফলাইট অনুরোধের প্রতিক্রিয়া অ্যাক্সেস নিয়ন্ত্রণ চেকটি পাস করে না: অনুরোধকৃত উত্সটিতে কোনও 'অ্যাক্সেস-কন্ট্রোল-অরিজিন-অরিজিন' শিরোনাম উপস্থিত নেই। মূল ' লোকালহোস্ট: 8090 ' তাই অ্যাক্সেসের অনুমতি নেই।
মার্সেল

22

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

@CrossOrigin

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


4
এই পদ্ধতি অনুসরণ করে সুরক্ষা ঝুঁকি কি?
বালাজি ভিগনেশ

আমার জন্য পরিশ্রমী, আমি সরাসরি প্রতিক্রিয়াতে শিরোলেখগুলি যুক্ত করার চেষ্টা করেছি তবে প্রাকফ্লাইটটি পরিচালনা না করায় এটি কার্যকর হয়নি। আমি মনে করি এটি সুরক্ষিত নয় তবে ব্যবহার করা হতে পারে কিছু অভ্যন্তরীণ অ্যাপ্লিকেশন।
amisiuryk

আমার জন্য কাজ করেছেন। অভ্যন্তরীণ অ্যাপ্লিকেশন জন্য বেশ সহজ সমাধান।
অজয় কুমার

8

উপরের অন্যান্য উত্তরের উপর ভিত্তি করে তৈরি করার জন্য, আপনার যদি স্প্রিং বুট আরআরএসটি সার্ভিস অ্যাপ্লিকেশন রয়েছে (স্প্রিং এমভিসি নয়) তবে স্প্রিং সিকিউরিটির মাধ্যমে সিওআরএস সক্ষম করা যথেষ্ট (যদি আপনি স্প্রিং এমভিসি ব্যবহার করেন তবে WebMvcConfigurer যোগেন দ্বারা উল্লিখিত শিমের হতে পারে) স্প্রিং সিকিউরিটি হিসাবে যাওয়ার উপায় এতে বর্ণিত সিওআরএস সংজ্ঞায় স্থান দেবে)

সুতরাং আপনার একটি সুরক্ষা কনফিগার করা দরকার যা নিম্নলিখিতগুলি করে:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

@Override
protected void configure(HttpSecurity http) throws Exception {
    //other http security config
    http.cors().configurationSource(corsConfigurationSource());
}

//This can be customized as required
CorsConfigurationSource corsConfigurationSource() {
    CorsConfiguration configuration = new CorsConfiguration();
    List<String> allowOrigins = Arrays.asList("*");
    configuration.setAllowedOrigins(allowOrigins);
    configuration.setAllowedMethods(singletonList("*"));
    configuration.setAllowedHeaders(singletonList("*"));
    //in case authentication is enabled this flag MUST be set, otherwise CORS requests will fail
    configuration.setAllowCredentials(true);
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", configuration);
    return source;
}

}

এই লিঙ্কটিতে আরও তথ্য রয়েছে: https://docs.spring.io/spring-security/site/docs/current/references/htmlsingle/#cors

বিঃদ্রঃ:

  1. প্রোড মোতায়েন অ্যাপ্লিকেশনটির জন্য সমস্ত উত্সের জন্য কর্স সক্ষম করা (*) সর্বদা ভাল ধারণা নাও হতে পারে।
  2. সিএসআরএফ কোনও সমস্যা ছাড়াই স্প্রিং এইচটিটিপিএসিকিউরিটি কাস্টমাইজেশনের মাধ্যমে সক্ষম করা যায়
  3. যদি আপনি স্প্রিংয়ের সাথে অ্যাপ্লিকেশনটিতে প্রমাণীকরণ সক্ষম করে থাকেন ( UserDetailsServiceউদাহরণস্বরূপ) তবে configuration.setAllowCredentials(true);অবশ্যই যুক্ত করা উচিত

স্প্রিং বুট 2.0.0.RELEASE (যেমন, স্প্রিং 5.0.4.RELEASE এবং স্প্রিং সুরক্ষা 5.0.3.RELEASE) এর জন্য পরীক্ষিত


এটি আমার সমস্যার সমাধান করেছে। স্প্রিং এবং স্প্রিং বুটে নতুন হওয়ার কারণে আমি বুঝতে পেরেছিলাম যে আমি স্রিং এমভিসি দিয়ে তৈরি করছি না। আমি একটি Vue.js ক্লায়েন্ট ছিল। অন্যান্য উত্তরগুলি স্প্রিং এমভিসির জন্য বলে মনে হয়েছিল, তবে এই উত্তরটি আমার ইতিমধ্যে প্রয়োগ করা প্রমাণীকরণ এবং অনুমোদনের সাথে দুর্দান্তভাবে প্লাগ হয়েছে।
জলেটেকস

হাই @ জ্যালেটেকস, আমি খুব বেশি nuxtJs (একটি ভয়েজ ফ্রেমওয়ার্ক) ব্যবহার করছি তবে যখন কুকি সেট করার কথা আসে তখন এটি কার্যকর হয় না। আপনি এই বিষয়ে সাহায্য করার জন্য যথেষ্ট সদয় হতে হবে?
কেমিট

6

আমি ব্যবহার করছি 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()এটি বসন্ত সুরক্ষায় সক্ষম করতে ব্যবহার করুন ):

@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);
}

নতুন CorsFilter (উত্স) প্রদান; এ জাতীয় নির্মাণকারীর ত্রুটি নয়
আডাম

@ অ্যাডাম আপনি কি আমার মত বসন্ত বুটের একই সংস্করণ ব্যবহার করছেন?
সেপ্টেম্বর GH

2.1.5 ব্যবহারে রয়েছে
আদম

@ অ্যাডাম দয়া করে নিশ্চিত হন যে আপনি কোর্স ফিল্টার ব্যবহার করছেন org.springframework.web.filter.CorsFilter। আমি দুর্ঘটনাক্রমে ক্যাটালিনা প্যাকেজগুলি থেকে এটি ব্যবহার করার সময় আমার একই সমস্যা ছিল।
সেপ্টেম্বর GH

5

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

@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;
        }
      });

      //...

   }

   //...

}

এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
অ্যাড্রিয়ানো মার্টিনস

4
যদি স্প্রিং সুরক্ষার মাধ্যমে প্রমাণীকরণ সক্ষম হয়, তবে কনফিগারেশন সেটওলোক্রেডেন্টিয়ালস (সত্য); অন্যথায় সিআরএস অনুরোধগুলি এখনও ব্যর্থ হবে
দীপক

2

আমার জন্য কেবলমাত্র 100% কাজ করেছিল যখন বসন্তের সুরক্ষা ব্যবহৃত হয় অতিরিক্ত ফিল্টার এবং মটরশুটিগুলির সমস্ত অতিরিক্ত ফ্লাফ এড়িয়ে যাওয়া এবং যে কোনও পরোক্ষ "যাদু" লোক তাদের পরামর্শ দিয়েছিল যে এটি তাদের জন্য কাজ করেছে তবে আমার জন্য নয়।

পরিবর্তে কেবল প্লেইন সহ আপনার প্রয়োজনীয় শিরোনামগুলি লিখতে বাধ্য করুন StaticHeadersWriter:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

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

        http
            // your security config here
            .authorizeRequests()
            .antMatchers(HttpMethod.TRACE, "/**").denyAll()
            .antMatchers("/admin/**").authenticated()
            .anyRequest().permitAll()
            .and().httpBasic()
            .and().headers().frameOptions().disable()
            .and().csrf().disable()
            .headers()
            // the headers you want here. This solved all my CORS problems! 
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Origin", "*"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Methods", "POST, GET"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Max-Age", "3600"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Credentials", "true"))
            .addHeaderWriter(new StaticHeadersWriter("Access-Control-Allow-Headers", "Origin,Accept,X-Requested-With,Content-Type,Access-Control-Request-Method,Access-Control-Request-Headers,Authorization"));
    }
}

এটি করার জন্য এটি আমার কাছে প্রত্যক্ষ এবং স্পষ্ট উপায় exp আশা করি এটি কাউকে সাহায্য করবে।


1

এটিই আমার পক্ষে কাজ করেছিল।

@EnableWebSecurity
public class WebSecurityConfiguration extends WebSecurityConfigurerAdapter {

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

        http.cors();
    }

}

@Configuration
public class WebConfiguration implements WebMvcConfigurer {

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry
            .addMapping("/**")
            .allowedMethods("*")
            .allowedHeaders("*")
            .allowedOrigins("*")
            .allowCredentials(true);
    }

}

1

ধাপ 1

টিকা সহ কন্ট্রোলারকে মন্তব্য দিয়ে @CrossOriginCORS কনফিগারেশনের অনুমতি দেওয়া হবে।

@CrossOrigin
@RestController
public class SampleController { 
  .....
}

ধাপ ২

স্প্রিংয়ের ইতিমধ্যে একটি কর্স ফিল্টার রয়েছে যদিও আপনার নিজের কনফিগারেশনটি নিম্নরূপভাবে সরবরাহ করতে আপনি কেবল নিজের নিজস্ব করস ফিল্টারকে শিম হিসাবে নিবন্ধন করতে পারেন।

@Bean
public CorsFilter corsFilter() {
    final UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    final CorsConfiguration config = new CorsConfiguration();
    config.setAllowedOrigins(Collections.singletonList("http://localhost:3000")); // Provide list of origins if you want multiple origins
    config.setAllowedHeaders(Arrays.asList("Origin", "Content-Type", "Accept"));
    config.setAllowedMethods(Arrays.asList("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH"));
    config.setAllowCredentials(true);
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

0

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

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

এই কোডটি প্রশ্নের উত্তর দিতে পারে, কেন এবং / অথবা এই কোডটির প্রশ্নের উত্তর কীভাবে তার দীর্ঘমেয়াদী মানকে উন্নত করে তা সম্পর্কিত অতিরিক্ত প্রসঙ্গ সরবরাহ করে।
রোলস্টুহফলাহার

0

আপনার @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();
        }
    });
   }
}

0

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

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

রেফারেন্স: এনজিএনএক্স-এ CORS


0

এই উত্তরটি @abosancic উত্তরের অনুলিপি করে তবে CORS শোষণ এড়াতে অতিরিক্ত সুরক্ষা যুক্ত করে ।

টিপ 1: অনুমোদিত হোস্টদের অ্যাক্সেসের তালিকা পরীক্ষা না করে আগত উত্সটি প্রতিফলিত করবেন না।

টিপ 2: কেবল শ্বেত তালিকাভুক্ত হোস্টের জন্য শংসাপত্রিত অনুরোধকে মঞ্জুরি দিন।

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
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);

    private List<String> allowedOrigins;

    public SimpleCORSFilter() {
        log.info("SimpleCORSFilter init");
        allowedOrigins = new ArrayList<>();
        allowedOrigins.add("https://mysafeorigin.com");
        allowedOrigins.add("https://itrustthissite.com");
    }

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

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

        String allowedOrigin = getOriginToAllow(request.getHeader("Origin"));

        if(allowedOrigin != null) {
            response.setHeader("Access-Control-Allow-Origin", allowedOrigin);
            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() {
    }

    public String getOriginToAllow(String incomingOrigin) {
        if(allowedOrigins.contains(incomingOrigin.toLowerCase())) {
            return incomingOrigin;
        } else {
            return null;
        }
    }
}

0

আমাদের স্প্রিং বুট অ্যাপে আমরা এর মতো কর্স কনফিগারেশনসোর্স সেট আপ করেছি।

allowedOrignsপ্রথমে যোগ করার ক্রম এবং তারপরে applyPermitDefaultValues()সেট করার ক্রমটি অনুমোদিত শিরোনাম, এক্সপোজড শিরোনাম, অনুমোদিত পদ্ধতি ইত্যাদির জন্য বসন্তকে ডিফল্ট মান সেট করতে দেয় যাতে আমাদের সেগুলি নির্দিষ্ট করতে হবে না।

    public CorsConfigurationSource corsConfigurationSource() {
        CorsConfiguration configuration = new CorsConfiguration();
        configuration.setAllowedOrigins(Arrays.asList("http://localhost:8084"));
        configuration.applyPermitDefaultValues();

        UrlBasedCorsConfigurationSource configurationSource = new UrlBasedCorsConfigurationSource();
        configurationSource.registerCorsConfiguration("/**", configuration);
        return configurationSource;
    }
    @Override
    protected void configure(HttpSecurity http) throws Exception {

        http.authorizeRequests()
                .antMatchers("/api/**")
                .access("@authProvider.validateApiKey(request)")
                .anyRequest().authenticated()
                .and().cors()
                .and().csrf().disable()
                .httpBasic().authenticationEntryPoint(authenticationEntryPoint);

        http.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);
    }

0

কেবল একটি একক শ্রেণি তৈরি করুন, এর সাথে সবকিছু ঠিকঠাক হবে:

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

            @Override
            public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
                final HttpServletResponse response = (HttpServletResponse) res;
                response.setHeader("Access-Control-Allow-Origin", "*");
                response.setHeader("Access-Control-Allow-Methods", "POST, PUT, GET, OPTIONS, DELETE");
                response.setHeader("Access-Control-Allow-Headers", "Authorization, Content-Type, enctype");
                response.setHeader("Access-Control-Max-Age", "3600");
                if (HttpMethod.OPTIONS.name().equalsIgnoreCase(((HttpServletRequest) req).getMethod())) {
                    response.setStatus(HttpServletResponse.SC_OK);
                } else {
                    chain.doFilter(req, res);
                }
            }

            @Override
            public void destroy() {
            }

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

0

স্প্রিং বুট এবং প্রতিক্রিয়ার মধ্যে সিওআরএস অক্ষম করার জন্য এটি আমার পক্ষে কাজ করেছে

@Configuration
public class CorsConfig implements WebMvcConfigurer {

    /**
     * Overriding the CORS configuration to exposed required header for ussd to work
     *
     * @param registry CorsRegistry
     */

    @Override
    public void addCorsMappings(CorsRegistry registry) {
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("*")
                .allowedHeaders("*")
                .allowCredentials(true)
                .maxAge(4800);
    }
}

আমাকে নীচের মত সুরক্ষা কনফিগারেশনটিও পরিবর্তন করতে হয়েছিল:

        @Override
        protected void configure(HttpSecurity http) throws Exception {
            http.csrf().disable()
                    .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;
                }
            }).and()
                    .antMatcher("/api/**")
                    .authorizeRequests()
                    .anyRequest().authenticated()
                    .and().httpBasic()
                    .and().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
                    .and().exceptionHandling().accessDeniedHandler(apiAccessDeniedHandler());
        }
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.