0

サーブレットを呼び出す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; DRSecurityContextHolder.getContext().getAuthentication() 私の例では何をしますか?

4

2 に答える 2

2

現在のログインユーザーの認証の詳細を取得します。追加しましたか

<bean id="httpSessionFilter" class="org.springframework.security.web.context.SecurityContextPersistenceFilter"/>

Webアプリケーションへのログインを導入するために、Spring SecurityはPOJOでも機能するように設計されています。古い方法で行う場合は、このフィルターをマッピングに追加する必要があります。applicationContextでhttpタグを使用している場合は、そのまま機能するはずです。

</security:filter-chain-map> 

applicatin Contextで新しいhttpタグなしで春のセキュリティを使用してから、かなり長い時間がかかりました。春のセキュリティコンテキストにはさまざまなフィルターが付属しています。SecurityContextPersistenceFilterは、コンテキストの永続化方法を決定します。

「org.springframework.security.web.context.SecurityContextPersistenceFilter」は、セッションごとにセキュリティコンテキストを永続化するためのものです。

同じタスクに対して「net.sf.acegisecurity.ui.webapp.HttpSessionIntegrationFilter」フィルターを使用していたacegiセキュリティとの統合から派生したSpringセキュリティ

于 2013-03-01T01:59:15.043 に答える
1

これはフィルターであるため、springはsessionidに基づいてセッションを識別できます。

于 2013-03-01T13:06:17.753 に答える