मैं एक आवेदन (वसंत-बूट एप्लिकेशन) पर एक दूसरे (कोणीय) से आरईएसटी एंडपॉइंट्स को कॉल करने का प्रयास कर रहा हूं। एप्लिकेशन निम्न होस्ट और बंदरगाहों पर चल रहे हैं।वसंत-बूट और कोणीय के साथ सीओआरएस काम नहीं कर रहे
- बाकी आवेदन, वसंत बूट का उपयोग कर,
http://localhost:8080
- एचटीएमएल आवेदन, AngularJS का उपयोग कर,
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);
}
}
सभी संचालकों कर रही हो {success: true}
के आधार पर यदि उपयोगकर्ता में लॉग इन, प्रमाणित करने के लिए विफल रहा है, या लॉग आउट की तरह एक JSON प्रतिक्रिया बाहर लिख रहे हैं। 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 सर्वर हैं। क्या आपने उस ट्यूटोरियल को देखा था? Https: //spring.io/guides/tutorials/spring-security-and-angular-js/ –
@GokhanOner मैं प्रमाणीकरण कैसे ले सकता हूं? शायद इस समस्या के लिए गायब टुकड़ा है। इसके अलावा, हाँ, मैं उन ट्यूटोरियल्स के माध्यम से गया था और नहीं सोचा था कि वे मेरे दृष्टिकोण के साथ गठबंधन थे। पहले दो हिस्सों में एचटीपी-बेसिक प्रमाणीकरण के साथ निपटाया गया, फिर तीसरा हिस्सा रेडिस (मैं निर्भरता के रूप में इसे प्राप्त करने की योजना नहीं बनाना चाहता था) के साथ निपटाया था, और फिर अंतिम ट्यूटोरियल वसंत बादल के साथ 'एपीआई गेटवे' के बारे में था, जिसे मैं सोचा एक ओवरकिल था। –
मुझे लगता है कि आप इसे रेडिस के बिना कर सकते हैं, यह सिर्फ एक महत्वपूर्ण मूल्य कैश स्टोर है। आपको फ्लाई पर मानचित्र के अंदर संभवतः स्टोर पर प्रमाणीकरण और सीएसआरएफ टोकन स्टोर करने की आवश्यकता है। यहां महत्वपूर्ण बात प्रमाणीकरण कुंजी है। उदाहरण देखें: https: //github.com/dsyer/spring-security-angular/tree/master/spring- सत्र और "संसाधन सर्वर" वाला पृष्ठ। आप कुछ अतिरिक्त बीन्स परिभाषित करेंगे, सीओआरएस फिल्टर का क्रम भी महत्वपूर्ण है। और कुछ प्रोप। परिवर्तन भी आवश्यक है। –