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);
}
}
あなたはこの投稿に従うことができますhttp://stackoverflow.com/questions/30366405/how-to-disable-spring-security-for-particular-url – htpvl
@kimdungありがとうございます。他の人もそれを読むことができるようにあなたのコメントを残してください。しかし、他の投稿のMDienumの答えは 'SecurityConfig'に' WebSecurity'オブジェクトを使っていますが、このOPのバージョンは 'HttpSecurity'を使っています。また、現在のOPのエラーメッセージには 'XSRF certificate'の問題が指定されていますが、あなたが与えたリンクのエラーは表示されませんでした。 'SecurityConfig'への入力を変更することを躊躇せずに、' XSRF'の問題が重要だと思っています。このURLは、AngularJSアプリケーションが同じJAR内にあるときに現在の設定を使用して呼び出し可能です。 – CodeMed