サーブレット マルチパート ポスト中に Spring Security 情報にアクセスできません。春のセキュリティ情報は、通常の get メソッドと post メソッドで利用できますが、マルチパート post メソッドでは利用できません。SecurityContextHolder.getContext().getAuthentication() と、SecurityContextHolder.getContext().getAuthentication() にアクセスする挿入されたサービスを介して、このセキュリティ情報に直接アクセスしようとしましたが、失敗しました。
また、HttpRequestHandler と ServletWrappingController も実装しました。繰り返しになりますが、Spring Bean をそれらに正常に注入し、通常の get および post メソッドの Spring Security 情報にアクセスできましたが、マルチパート投稿の Spring Security 情報にアクセスできませんでした。Spring 3.0 に組み込まれた新しい MultiPart 機能があることは知っていますが、私たちの Web サイトではファイル アップロード ストリームへのフル アクセスが必要になるため、それらを使用することはできません。そのため、私は HttpServlet、HttpRequestHandler、および ServletWrappingController に注目しています。
私がここに投稿しているコードは、マルチパート アップロード中にセキュリティ情報が利用できないという私が直面しているこの特定の問題を解決するために書かれたすべてのテスト コードです (製品品質を意図したものではありません)。HttpServlet 用です。
私が間違っていることがあれば教えてください。または、そうでない場合、ファイル アップロード ストリームへのアクセスを維持しながら、Spring Security 情報へのアクセスを使用してマルチパート アップロードを実行するための回避策またはより良い方法がある場合は? この問題に関して誰かが提供できる支援は大歓迎です!
以下は、テスト サーブレット コードです。以下のコメントは、Spring Security 3.1 を使用して Web サイトにログインしたユーザーに基づいています。
//many import statements not displayed
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.context.support.SpringBeanAutowiringSupport;
import org.springframework.security.core.GrantedAuthority;
import org.springframework.security.core.context.SecurityContextHolder;
public class UploadServlet extends HttpServlet {
public void service(HttpServletRequest req, HttpServletResponse res) throws IOException, ServletException {
super.service(req, res);
}
public void init(ServletConfig config) throws ServletException {
super.init(config);
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this,
config.getServletContext());
}
//The following is always injected and available
//however, it only returns valid security information for regular get and post methods,
//not for multipart post methods
@Autowired
private CustomUserService customUserService;
//The following is always injected and available and always returns the expected data
@Autowired
private GuideService guideService;
//the following does not work when the client issues a multipart post, it does work for non-multipart
public boolean getAuthenticated(){
boolean authorized = false;
for (GrantedAuthority authority : SecurityContextHolder.getContext().getAuthentication().getAuthorities()) {
if(authority.getAuthority().equals("ROLE_USER") || authority.getAuthority().equals("ROLE_ADMIN")) {
authorized = true;
break;
}
}
return authorized;
}
//The following test get method works fine
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
if(getAuthenticated()){
PrintWriter out = resp.getWriter();
out.write("<h1>Guide Info</h1><br/>");
Guide guide = guideService.findById(2l);
out.write(guide.getName() + "<br/>");
out.write(guide.getDescription() + "<br/>");
out.write("UserName: " + customUserService.getCurrentUser().getUsername() + "<br/>");
}
else{
PrintWriter out = resp.getWriter();
out.write("<h1>You're not authorized</h1><br/>");
}
}
//This post method
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//the following always works, whether the clients posts using multipart or not
String guideName = guideService.findById(2l).getName();
//the following does not work when the client issues a multipart post, it does work for non-multipart
String userName = customUserService.getCurrentUser().getUsername();
//the following does not work when the client issues a multipart post, it does work for non-multipart
if(getAuthenticated()){
String responseString = RESP_SUCCESS;
boolean isMultipart = ServletFileUpload.isMultipartContent(req);
if (isMultipart) {
ServletFileUpload upload = new ServletFileUpload();
//commmons fileupload code
// Not a multi-part MIME request.
else {
//...
}
//...
}
else{
//...
}
}
}
web.xml の関連部分は次のとおりです。
<servlet>
<servlet-name>fgm</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>WEB-INF/spring/webmvc-config.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>fgm</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>UploadServlet</servlet-name>
<servlet-class>com.guides.servlet.UploadServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>UploadServlet</servlet-name>
<url-pattern>/upload</url-pattern>
</servlet-mapping>