私はそれが意図された方法ではなく、完全に間違っていることを知っていますが、注文は注文です、私は次のことをする必要があります:ユーザーは次のようにパラメータのアクセスキーを使用してサーブレットにアクセスします:
http://myhost/my_app/servlet?accesskey=XXXXX
次に、サーブレットはキーを取得し、それを使用してシームでユーザーを認証します。それは可能ですか?今のところなんとかできませんでした
私はそれが意図された方法ではなく、完全に間違っていることを知っていますが、注文は注文です、私は次のことをする必要があります:ユーザーは次のようにパラメータのアクセスキーを使用してサーブレットにアクセスします:
http://myhost/my_app/servlet?accesskey=XXXXX
次に、サーブレットはキーを取得し、それを使用してシームでユーザーを認証します。それは可能ですか?今のところなんとかできませんでした
サーブレットのこのコードにより、Seamコンポーネントにアクセスできるようになります。
Lifecycle.beginCall();
Authenticator authenticator = (Authenticator)Component.getInstance("authenticator");
LifeCycle.endCall();
あなたの質問から、カスタム サーブレットを作成する必要があるのか、それともリクエスト パラメータに基づいてログインする必要があるのか が明確ではありません。主な違いは、カスタム サーブレットが 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(...);
}
}