1

私はそれが意図された方法ではなく、完全に間違っていることを知っていますが、注文は注文です、私は次のことをする必要があります:ユーザーは次のようにパラメータのアクセスキーを使用してサーブレットにアクセスします:

http://myhost/my_app/servlet?accesskey=XXXXX

次に、サーブレットはキーを取得し、それを使用してシームでユーザーを認証します。それは可能ですか?今のところなんとかできませんでした

4

2 に答える 2

1

サーブレットのこのコードにより、Seamコンポーネントにアクセスできるようになります。

Lifecycle.beginCall();

Authenticator authenticator = (Authenticator)Component.getInstance("authenticator");

LifeCycle.endCall();
于 2012-09-03T20:43:01.700 に答える
1

あなたの質問から、カスタム サーブレットを作成する必要があるのか​​、それともリクエスト パラメータに基づいてログインする必要があるのか​​ が明確ではありません。主な違いは、カスタム サーブレットが Seam によってインターセプトされず、Seam ライフサイクルを手動で開始しない限りコンポーネントを使用できないことです (Trind が指摘したように、外部から呼び出すときに Seam コンポーネントを使用し、使用できるようにするLifeCycle.beginCall()必要があります)。それ以外は、2 つのソリューションは同様に機能します。LifeCycle.endCall()SeamFilter

認証を処理するコンポーネントを作成します。

@Name("myAuthenticator")
public class MyAuthenticator implements Serializable {

    // Seam's identity component
    @In private transient Identity identity;

    // When logged in, the user needs to have some roles, usually
    // you assign these dynamically based on user name, type, etc., here
    // I just initialize it to a fixed list of roles
    ArrayList<String> roles = new ArrayList<String>(Arrays.toList(
            new String[] { "base", "admin" }));

    // Access key (getters and setters omitted but are necessary)
    private String accessKey;

    public String doAuth() {
        // Check accessKey validity (against an SSO service or 
        // in your DB or whatever), here we do a trivial check.
        boolean userCanAccess = "ADMINKEY".equals(accessKey);

        if (userCanAccess) {
            identity.acceptExternallyAuthenticatedPrincipal(
                    new SimplePrincipal("username"));

            // Assign user roles
            for (String role : roles) {
                identity.addRole(role);
            }
            return "ok";
        }
        return "ko";
    }
}

次に、パラメーターを介してログインを処理するログイン ページ記述子を作成します (たとえば、このためのページexternalLogin.page.xmlを作成する必要はありません)。.xhtml

<page>
    <!-- this sets the accessKey variable with the query parameter -->
    <param name="accessKey" value="#{myAuthenticator.accessKey}" />

    <!-- this invokes our authentication action -->
    <action execute="#{myAuthenticator.doAuth}" />

    <!-- navigation rules, these determine what to do if auth is ok or fails -->
    <navigation from-action="#{myAuthenticator.doAuth}">
        <rule if-outcome="ko">
            <redirect view-id="/error.xhtml">
                <message severity="ERROR">Invalid Authentication Key</message>
            </redirect>
        </rule>
        <rule if-outcome="ok">
            <redirect view-id="/home.xhtml">
                <message severity="INFO">Welcome!</message>
            </redirect>
        </rule>
    </navigation>
</page>

ログインを実行するには、次のようにそのページを使用できます。

http://localhost:8080/yourapp/externalLogin.seam?accessKey=XXXXXXXX

カスタム サーブレットを使用する必要がある場合 (ほとんどありませんが)、上記のコンポーネントは変更されません。次のようにサーブレット内から呼び出すだけです。

public void doGet(HttpServletRequest req, HttpServletResponse resp) throws IOException {
    // Start Seam lifecycle
    LifeCycle.beginCall();
    // Get an instance of the authenticator component from Seam
    MyAuthenticator auth = Component.getInstance("myAuthenticator");
    // Set access key in component and perform auth
    auth.setAccessKey(req.getParameter("accessKey"));
    String result = auth.doAuth();
    // End Seam lifecycle, no more component calls are needed.
    LifeCycle.endCall();

    // Do something here with the result
    if ("ok".equals(result)) {
        resp.sendRedirect(...);
    }
}
于 2012-09-10T15:21:42.930 に答える