2016-04-07 12 views
0

Spring Boot Appは、Spring Securityを使用して、そのAPIの要素を権限のないユーザーから保護します。しかし、このアプリは、特定のアプリのユーザーである限り、認証されていないユーザーから呼び出し可能な公開URLパターンを持っています。 /some-test-serviceエンドポイントが認証されていないユーザから特定の発信ロケーションから正常に呼び出せるように、以下のコードにどのような変更を加える必要がありますか?特定のアプリケーションからのREST呼び出しを許可するためにSpring Securityを設定するにはどうすればよいですか?

たとえば、ターミナルコマンドがSpringブートアプリケーションを実行するのと同じローカルホストから実行されていることがわかります。フロントエンドのAngularJS/Node.jsコールアプリがport 9000のような特定のポートで動作していることも知っています。ここで

は、私は春のブートアプリを実行しますdevboxでCentOSの端子から次のPOSTテストで入力するときに何が起こるかです:

[[email protected] controllers]$ curl -i -X POST -H "Content-Type:application/json" -d '{ "wleadid" : "1" }' http://localhost:8001/some-test-service 
HTTP/1.1 403 Forbidden 
Server: Apache-Coyote/1.1 
X-Content-Type-Options: nosniff 
X-XSS-Protection: 1; mode=block 
Cache-Control: no-cache, no-store, max-age=0, must-revalidate 
Pragma: no-cache 
Expires: 0 
X-Frame-Options: DENY 
Set-Cookie: JSESSIONID=530A75F962CCFB95EEDF43051BC71573; Path=/; HttpOnly 
Content-Type: application/json;charset=UTF-8 
Transfer-Encoding: chunked 
Date: Wed, 06 Apr 2016 09:11:09 GMT 
{"timestamp":1459933869769,"status":403,"error":"Forbidden","message":"Expected CSRF token not found. Has your session expired?","path":"/some-test-service"} 
[[email protected] controllers]$ 

そして、ここではその完全UiApplication.javaで、春のセキュリティ設定でありますこれはSpring Bootアプリのメインクラスです:

@SpringBootApplication 
@Controller 
@EnableJpaRepositories(basePackages = "demo", considerNestedRepositories = true) 
public class UiApplication extends WebMvcConfigurerAdapter { 

    @Autowired 
    private Users users; 

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

    @Bean 
    public PasswordEncoder passwordEncoder() { 
     return new BCryptPasswordEncoder(); 
    } 

    @Bean 
    public LocaleResolver localeResolver() { 
     SessionLocaleResolver slr = new SessionLocaleResolver(); 
     slr.setDefaultLocale(Locale.US); 
     return slr; 
    } 

    @Bean 
    public LocaleChangeInterceptor localeChangeInterceptor() { 
     LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); 
     lci.setParamName("lang"); 
     return lci; 
    } 

    @Override 
    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(localeChangeInterceptor()); 
    } 

    @Order(Ordered.HIGHEST_PRECEDENCE) 
    @Configuration 
    protected static class AuthenticationSecurity extends GlobalAuthenticationConfigurerAdapter { 

     @Autowired 
     private Users users; 

     @Override 
     public void init(AuthenticationManagerBuilder auth) throws Exception { 
      auth.userDetailsService(users); 
     } 
    } 

    @SuppressWarnings("deprecation") 
    @Configuration 
    @Order(SecurityProperties.ACCESS_OVERRIDE_ORDER) 
    @EnableWebMvcSecurity 
    @EnableGlobalMethodSecurity(prePostEnabled = true) 
    protected static class SecurityConfiguration extends WebSecurityConfigurerAdapter { 

     @Override 
     protected void configure(HttpSecurity http) throws Exception { 
      http 
       .formLogin() 
        .successHandler(new MyAuthenticationSuccessHandler()) 
        .and() 
       .httpBasic().and() 
       .authorizeRequests() 
        .antMatchers("/some-test-service").permitAll() 
        .antMatchers("/", "/url1", "/url2", "/url3*", "/url4*", "/url5*").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 { 
        System.out.println("----- INSIDE new OncePerRequestFilter().doFilterInternal(...) "); 
        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); 
        System.out.println("csrf.getToken() is: "+csrf.getToken()); 
       } 
      }; 
     } 

     private CsrfTokenRepository csrfTokenRepository() { 
      HttpSessionCsrfTokenRepository repository = new HttpSessionCsrfTokenRepository(); 
      repository.setHeaderName("X-XSRF-TOKEN"); 
      System.out.println("repository.toString() is: "+repository.toString()); 
      return repository; 
     } 

    } 

    @Repository 
    interface UserRepository extends CrudRepository<User, Long> { 
     User findByName(String name); 
    } 

} 
+0

あなたはこの投稿に従うことができますhttp://stackoverflow.com/questions/30366405/how-to-disable-spring-security-for-particular-url – htpvl

+0

@kimdungありがとうございます。他の人もそれを読むことができるようにあなたのコメントを残してください。しかし、他の投稿のMDienumの答えは 'SecurityConfig'に' WebSecurity'オブジェクトを使っていますが、このOPのバージョンは 'HttpSecurity'を使っています。また、現在のOPのエラーメッセージには 'XSRF certificate'の問題が指定されていますが、あなたが与えたリンクのエラーは表示されませんでした。 'SecurityConfig'への入力を変更することを躊躇せずに、' XSRF'の問題が重要だと思っています。このURLは、AngularJSアプリケーションが同じJAR内にあるときに現在の設定を使用して呼び出し可能です。 – CodeMed

答えて

0

私は同様の問題がありました。しかし、私の設定はcsrfなしで動作します。 公開アクセス: "localhost:8080/someTestUrl /"にリンクしますが、その他の参照には承認が必要です。

マイcongfiguration:

@Configuration 
@EnableWebSecurity 
@EnableGlobalMethodSecurity(prePostEnabled = true) 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

@Autowired 
MongoDBAuthenticationProviderService authenticationProvider; 

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

@Override 
protected void configure(HttpSecurity http) throws Exception { 
    http.csrf().disable(); 

    http 
      .anonymous() 
      .and() 
      .authorizeRequests().antMatchers("/someTestUrl").permitAll() 
      .and() 
      .formLogin().permitAll().loginPage("/login").usernameParameter("username").passwordParameter("password") 
      .and() 
      .logout().permitAll() 
      .and() 
      .authorizeRequests().anyRequest().fullyAuthenticated() 
      .and() 
      .httpBasic().disable() 
      .exceptionHandling().accessDeniedPage("/403") 
      .and() 
      .headers() 
      .contentTypeOptions() 
      .disable(); 
} 
} 

そしてResourseConfig:

多分それはあなたを助けるでしょう。

+0

'SecurityConfig'の' formLogin()... '部分が解決されない前に' .anonymous()。and()。authorizeRequests()。antMatchers( "/ someTestUrl")。permitAll()。と()問題。 'ResourceConfig'とは何ですか? – CodeMed

関連する問題