私は、RESTインターフェースを提供するSpring-MVCバックエンド(およびGWTフロントエンド)に取り組んでいます。セキュリティ上の理由から、リクエストごとにトークンを検証する必要があります。ここで問題となるのは、すべてのコントローラー内にトークンをチェックする必要があることを書き込まずに、そのトークンをチェックするにはどうすればよいですか?リクエストが担当のコントローラーに到着してトークンをチェックし、有効な場合はデータをコントローラーに渡す前に実行されるメソッドを持つクラスを考えます。
有線で送信されるJSONデータは次のようになります。
{
"data":
{
"id":1,
"firstName":"firstExample",
"lastName":"lastExample"
},
"csrf":"myCSRFToken"
}
Springの残りのセットアップは次のようになります。
web.xml:
<context-param>
<param-name>contextClass</param-name>
<param-value>org.springframework.web.context.support.AnnotationConfigWebApplicationContext</param-value>
</context-param>
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>myapp.server.AppConfig</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/rest/*</url-pattern>
</servlet-mapping>
dispatcher-servlet.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<context:component-scan base-package="myapp.server.controller" />
<mvc:annotation-driven />
</beans>
AppConfig.java:
@Configuration
@EnableWebMvc
public class AppConfig {
//
}
PersonController:
@Controller
@RequestMapping("/persons")
public class PersonController {
@ResponseBody
@RequestMapping(method = RequestMethod.GET)
public Collection<Person> list() {
//
}
}
つまり、基本的な考え方は、私のCSRFCheck.javaクラスが最初にすべてのリクエストを受け取るということです。CSRFトークンをチェックし、JSONの「データ」セクションの内容を担当のコントローラーに転送します。したがって、コントローラーは次のものを受け取ります。
{
"id":1,
"firstName":"firstExample",
"lastName":"lastExample"
}
私はSpringにまったく慣れていないので、期待どおりに機能するように構成を変更する必要がある場所を知りたいです。
ありがとうございました!
現在、dispatcher-servlet.xml内で次のコードを使用しています。
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
<context:component-scan base-package="myapp.server.controller" />
<mvc:annotation-driven />
<mvc:interceptors>
<bean class="myapp.server.XSRFInterceptor" />
</mvc:interceptors>
</beans>
しかし、なぜこのAppConfig.javaで機能しないのですか?:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages="myapp.server.controller")
public class AppConfig extends WebMvcConfigurerAdapter {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new XSRFInterceptor());
}
}
そして、まだ疑問があります。コントローラーに渡されるJSONを変更するにはどうすればよいですか?
問題1の解決策(xmlとjava):
dispatcher-servlet.xml:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p"
xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="
http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd">
</beans>
上記のAppConfig.java
CSRFInterceptor.java:
@Component
public class CSRFInterceptor extends HandlerInterceptorAdapter {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
// Some code
return true;
}
}
まだ解決できません:インターセプター内でJSONデータを操作するにはどうすればよいですか?