サーブレットを呼び出すJavaがあります。
public class UserServlet extends HttpServlet {
@Autowired
private UserService userService;
@Override
protected void service(final HttpServletRequest request, final HttpServletResponse response) throws ServletException, IOException {
userService.checkUser();
userService.doSomethingRestricted();
}
@Override
public void init(final ServletConfig config) throws ServletException {
SpringBeanAutowiringSupport.processInjectionBasedOnCurrentContext(this);
SpringBeanAutowiringSupport.processInjectionBasedOnServletContext(this, config.getServletContext());
super.init(config);
}
}
そして私の自動配線サービス:
@Component(value = "userService")
public class UserService {
public boolean checkUser() {
if (SecurityContextHolder.getContext().getAuthentication() != null) {
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
if (auth != null && auth.getPrincipal() != null && auth.getPrincipal() instanceof User) {
User springUser = (User) auth.getPrincipal();
if (springUser != null) {
LOG.debug("USER CONNECTED :: {}", springUser.getUsername());
}
}
} else {
LOG.debug("NO CONNECTED USER, CREATING ONE");
Collection<GrantedAuthority> authorities = getGrantedAuthorities();
org.springframework.security.core.userdetails.User springUser = new org.springframework.security.core.userdetails.User("user","password", true, true, true, true, authorities);
Authentication auth = new UsernamePasswordAuthenticationToken(springUser, "", authorities);
SecurityContext sc = new SecurityContextImpl();
sc.setAuthentication(auth);
SecurityContextHolder.setContext(sc);
}
return true;
}
@Secured({ "CONNECTED" })
public void doSomethingRestricted() {
LOG.debug("SOMETHING RESTRICTED HAS BEEN DONE!!");
}
}
アプリケーションを初めてテストするとき、Javaクライアント
POST
はサーバーにを送信します。サーバーはユーザーをチェックし、コンテキストを見つけられません。新しいコンテキストが作成されます。その後Javaクライアントを実行すると、既存のコンテキスト(最初の呼び出しで作成されたコンテキスト)が見つかります。
最初のユーザーが正常にログインした場合、それはすべてのユーザーが接続できることを意味しないため、明らかに何かが欠けています。
私は何が欠けていますか?最初は、Javaクライアントのインスタンスごとにセッションを使用することを考えました(Webブラウザクライアントがないため、セッションIDを手動で設定する必要があります)が、SpringはいつhttpリクエストでセッションIDを取得または設定する必要がありますか?
TL; DR :SecurityContextHolder.getContext().getAuthentication()
私の例では何をしますか?