2015-02-11 19 views
12

के साथ वसंत बूट और सुरक्षा मैं वसंत सुरक्षा के लिए एक कस्टम AngularJS लॉगिन पृष्ठ लागू कर रहा हूं, और मुझे प्रमाणीकरण के मुद्दे हैं।कस्टम AngularJS लॉगिन पृष्ठ

मैं इस ट्यूटोरियल/उदाहरण का अनुसरण कर रहा हूँ, और उनके उदाहरण ठीक स्थानीय स्तर पर काम करता है: https://github.com/dsyer/spring-security-angular/tree/master/single

हालांकि, जब मैं इस अपने आप को लागू करने के लिए प्रयास करते हैं, मैं प्रमाणित करने के लिए सक्षम नहीं हूँ, और मुझे यकीन है कि जहां नहीं कर रहा हूँ मेरी गलती है

एक पोस्ट को क्रेडेंशियल्स के साथ/लॉगिन करने के लिए बनाया जाता है, (कर्ल उदाहरण के समान है), और मुझे जीईटी/लॉगिन/पर रीडायरेक्ट के साथ 302 मिला है, जो 404 नहीं मिला है।

जब मैं/लॉगिन करने के लिए पोस्ट करने की कोशिश, स्प्रिंग किसी भी डीबग लॉग उत्पन्न नहीं करता है, तो मुझे यकीन है कि यह कैसे 302

मेरे कोड यहां पाया जा सकता सेवारत है नहीं कर रहा हूँ: https://github.com/AndrewBell/spring-angular-starter/tree/master

उल्लेखनीय परिवर्तन (और सबसे अधिक संभावना मेरी मुद्दों के स्रोत):

  • फ़ाइल संरचना बदल जाती

  • का उपयोग करते हुए सख्ती से कोणीय (कोई jQuery) - कौन सा/wro4j

  • कोणीय कोड स्टाइल के बजाय बोवर का उपयोग करते हुए पोस्ट अनुरोध

  • बनाने के लिए आवश्यक एक अलग समारोह में परिणाम देखते हुए

कई संबंधित वसंत सुरक्षा प्रश्नों का सुझाव है कि POST अनुरोध को गलत तरीके से स्वरूपित किया गया है, लेकिन मेरा उदाहरण उदाहरण के समान होता है (कम से कम जब मैं क्रोम देव कंसोल में कर्ल की प्रतिलिपि बनाता हूं)। अन्य कस्टम प्राधिकरण प्रदाताओं को लागू करने का सुझाव देते हैं, लेकिन उदाहरण में इसकी आवश्यकता नहीं है, इसलिए मैं इस बात से परेशान हूं कि मेरा और उदाहरण के बीच क्या अंतर है। मुझे स्टैक एक्सचेंज में मदद करें, आप मेरी एकमात्र आशा है।

देव उपकरण: imgurDOTcom/एक/B2KmV

प्रासंगिक कोड:

login.js

'use strict'; 
 
angular 
 
    .module('webApp') 
 
    .controller('LoginCtrl', ['$root`enter code here`Scope', '$scope', '$http', '$location', '$route', function($rootScope, $scope, $http, $location, $route) { 
 
     console.log("LoginCtrl created."); 
 

 
     var vm = this; 
 
     vm.credentials = { 
 
      username: "", 
 
      password: "" 
 
     }; 
 
     //vm.login = login; 
 

 
     $scope.tab = function(route) { 
 
      return $route.current && route === $route.current.controller; 
 
     }; 
 

 
     var authenticate = function(callback) { 
 

 
      $http.get('user').success(function(data) { 
 
       console.log("/user success: " + JSON.stringify(data)); 
 
       if (data.name) { 
 
        console.log("And Authenticated!"); 
 
        $rootScope.authenticated = true; 
 
       } else { 
 
        console.log("But received invalid data."); 
 
        $rootScope.authenticated = false; 
 
       } 
 
       callback && callback(); 
 
      }).error(function(response) { 
 
       console.log("/user failure." + JSON.stringify(response)); 
 
       $rootScope.authenticated = false; 
 
       callback && callback(); 
 
      }); 
 

 
     }; 
 

 
     authenticate(); 
 

 
     $scope.login = function() { 
 

 
      var data2 = 'username=' + encodeURIComponent(vm.credentials.username) + 
 
       '&password=' + encodeURIComponent(vm.credentials.password); 
 

 
      $http.post('login', data2, { 
 
       headers : { 
 
        'Content-Type': 'application/x-www-form-urlencoded' 
 
       } 
 
      }).success(function() { 
 
       authenticate(function() { 
 
        if ($rootScope.authenticated) { 
 
         console.log("Login succeeded"); 
 
         $location.path("/"); 
 
         $scope.error = false; 
 
         $rootScope.authenticated = true; 
 
        } else { 
 
         console.log("Login failed with redirect"); 
 
         $location.path("/login"); 
 
         $scope.error = true; 
 
         $rootScope.authenticated = false; 
 
        } 
 
       }); 
 
      }).error(function() { 
 
       console.log("Login failed"); 
 
       $location.path("/login"); 
 
       $scope.error = true; 
 
       $rootScope.authenticated = false; 
 
      }) 
 
     }; 
 

 
     $scope.logout = function() { 
 
      $http.post('logout', {}).success(function() { 
 
       $rootScope.authenticated = false; 
 
       $location.path("/"); 
 
      }).error(function() { 
 
       console.log("Logout failed"); 
 
       $rootScope.authenticated = false; 
 
      }); 
 
     } 
 

 
    }]);

application.java

0,123,
package com.recursivechaos.springangularstarter; 

import org.springframework.boot.SpringApplication; 
import org.springframework.boot.autoconfigure.SpringBootApplication; 
import org.springframework.boot.autoconfigure.security.SecurityProperties; 
import org.springframework.context.annotation.Configuration; 
import org.springframework.core.annotation.Order; 
import org.springframework.security.config.annotation.web.builders.HttpSecurity; 
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter; 
import org.springframework.security.web.csrf.CsrfFilter; 
import org.springframework.security.web.csrf.CsrfToken; 
import org.springframework.security.web.csrf.CsrfTokenRepository; 
import org.springframework.security.web.csrf.HttpSessionCsrfTokenRepository; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 
import org.springframework.web.filter.OncePerRequestFilter; 
import org.springframework.web.util.WebUtils; 

import javax.servlet.Filter; 
import javax.servlet.FilterChain; 
import javax.servlet.ServletException; 
import javax.servlet.http.Cookie; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import java.io.IOException; 
import java.security.Principal; 
import java.util.HashMap; 
import java.util.Map; 
import java.util.UUID; 

@SpringBootApplication 
@RestController 
public class Application { 

    public static void main(String[] args) { 
     SpringApplication.run(Application.class, args); 
    } 

    @RequestMapping("/user") 
    public Principal user(Principal user) { 
     return user; 
    } 

    @RequestMapping("/resource") 
    public Map<String, Object> home() { 
     Map<String, Object> model = new HashMap<>(); 
     model.put("id", UUID.randomUUID().toString()); 
     model.put("content", "Hello World"); 
     return model; 
    } 

    @Configuration 
    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
    protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter { 
     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http. 
       formLogin(). 
       //loginPage("/#/login"). 
      and(). 
       logout(). 
      and(). 
       authorizeRequests(). 
       antMatchers("/index.html", "/home/**", "/login/**", "/bower_components/**", "/", "/main.js", "/login/", "/navigation/**","/login","login/","/login.html"). 
       permitAll(). 
       anyRequest(). 
       authenticated(). 
      and(). 
       csrf(). 
       csrfTokenRepository(csrfTokenRepository()). 
      and(). 
       addFilterAfter(csrfHeaderFilter(), CsrfFilter.class); 
     } 

     private Filter csrfHeaderFilter() { 
      return new OncePerRequestFilter() { 
       @Override 
       protected void doFilterInternal(HttpServletRequest request, 
               HttpServletResponse response, FilterChain filterChain) 
        throws ServletException, IOException { 
        CsrfToken csrf = (CsrfToken) request.getAttribute(CsrfToken.class 
         .getName()); 
        if (csrf != null) { 
         Cookie cookie = WebUtils.getCookie(request, "XSRF-TOKEN"); 
         String token = csrf.getToken(); 
         if (cookie == null || token != null 
          && !token.equals(cookie.getValue())) { 
          cookie = new Cookie("XSRF-TOKEN", token); 
          cookie.setPath("/"); 
          response.addCookie(cookie); 
         } 
        } 
        filterChain.doFilter(request, response); 
       } 
      }; 
     } 

     private CsrfTokenRepository csrfTokenRepository() { 
      HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
      repository.setHeaderName("X-XSRF-TOKEN"); 
      return repository; 
     } 
    } 

} 
+0

अगर आपको रीडायरेक्ट किया जाता है/लॉगिन होता है तो इसका मतलब है कि आपको प्रमाणित नहीं किया गया है (लेकिन यह 404 नहीं होना चाहिए ताकि यह अजीब हो)। एक्सेस निर्णय के बारे में अधिक विस्तृत जानकारी प्राप्त करने के लिए आप 'org.springframework.security' के लिए डीबग लॉगिंग पर स्विच कर सकते हैं (मुझे उम्मीद है कि प्रमाण-पत्र किसी भी तरह से खराब थे), उदा। 'logging.level.org.springframework.security = DEBUG' को 'एप्लिकेशन में सेट करें। [गुण, yml]'। –

+0

@ डेवसियर लॉग के माध्यम से देख रहे हैं, मुझे एक पोस्ट देखने के लिए प्रतीत नहीं होता है/लॉगिन मैं कैसे सत्यापित कर सकता हूं कि वसंत पोस्ट/लॉगिन को संभालने में सक्षम है? http://pastebin.com/GeUkCUvg – Andrew

+1

यह एक पथ समस्या (या संभवतः गुंजाइश) प्रतीत होता है, क्योंकि मैं आपके "सिंगल" प्रोजेक्ट को जिथब उदाहरणों से खींचने में सक्षम था, wro4j को हटाता हूं, और निम्न के साथ प्रतिस्थापित करता हूं बोवर निर्भरताएँ: "कोणीय": "^ 1.3.0", "कोणीय संसाधन": "^ 1.3.0", "कोणीय बूटस्ट्रैप": "~ 0.12.0", "बूटस्ट्रैप-सीएसएस-ओनली": "~ 3.3.2", "कोणीय मार्ग": "~ 1.3.11" और उपयोग ... var req = 'username =' + ($ scope.credentials.username) + = '+ ($ scope.credentials.password); $ http.post ('लॉगिन', अनुरोध .... ठीक काम करने के लिए लगता है – Andrew

उत्तर

0

कोशिश WebSecuritConfigAdapter

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity 
public class WebSecurityConfig extends WebSecurityConfigurerAdapter { 

    @Override 
    protected void configure(HttpSecurity httpSecurity) throws Exception { 
     httpSecurity 
      .authorizeRequests() 
      .antMatchers("/**").permitAll() 
      .anyRequest().authenticated(); 
    } 
} 
0

एक बात login.js है कि यह आह्वान authenticate() जो/उपयोगकर्ता कॉल के साथ worng है और आप प्राप्त करने के लिए/लॉगिन/एक रीडायरेक्ट मिल जोड़ने। वसंत login.jsp के लिए दिखता है जो वहां नहीं है और 404 के साथ समाप्त नहीं हुआ है।

आप इसे निम्नलिखित कदम उठाकर काम कर सकते हैं:

1) login.js

2) जोड़े लॉगिन प्रसंस्करण URL में लाइन 38 से authenticate() के आह्वान निकालें की तरह:

http. 
    formLogin(). 
    loginProcessingUrl("/perform_login"). 
    and(). 
    logout() 
.... 

3) अपना लॉगिन यूआरएल 'perform_login' में बदलें:

$http.post('perform_login', data2, { 
      headers : { 
       'Content-Type': 'application/x-www-form-urlencoded' 
      } 
     }).... 

और यह काम करता है, आप उपयोगकर्ता को मिलता है।

वसंत सुरक्षा कॉन्फ़िगरेशन के लिए http://www.baeldung.com/spring-security-login का संदर्भ लें।

संबंधित मुद्दे