CQ5.5 SSO を構成し、@SlingFilter を使用して HTTP ヘッダー値を設定しようとしています。
SlingFilter が SSO 認証ハンドラーの後にリクエストを処理しているため、HTTP ヘッダーで検証済みのユーザーを見つけることができない実行タイミングの問題があるようです。
フィルタにサービス ランキングを設定して、実行の順序を制御できます。
@Properties({ @Property(name = Constants.SERVICE_DESCRIPTION, value = "Description"),
@Property(name = Constants.SERVICE_VENDOR, value = "Vendor"),
@Property(name = Constants.SERVICE_RANKING, intValue = -760, propertyPrivate = true),
@Property(name = "filter.scope", value = "request", propertyPrivate = true)
})
コンポーネントのプロパティを確認することで、既存のフィルターのサービス ランキングを確認できます。
http://localhost:4502/system/console/components/org.apache.sling.i18n.impl.I18NFilter
コンポーネントのサービス ランキングが同じ場合、その service.id を使用して順序が決定されるようです。
最近のリクエストを見ると、ファイラーが処理されている順序がわかります
http://localhost:4502/system/console/requests
リクエストを選択します。次のように表示されます。
0 (2013-04-04 15:12:56) LOG Calling filter: org.apache.sling.bgservlets.impl.BackgroundServletStarterFilter
0 (2013-04-04 15:12:56) LOG Calling filter: org.apache.sling.i18n.impl.I18NFilter
0 (2013-04-04 15:12:56) LOG Calling filter: org.apache.sling.rewriter.impl.RewriterFilter
0 (2013-04-04 15:12:56) LOG Calling filter: com.day.cq.wcm.core.impl.WCMRequestFilter
0 (2013-04-04 15:12:56) LOG Calling filter: com.day.cq.wcm.foundation.forms.impl.FormsHandlingServlet
2 (2013-04-04 15:12:56) LOG Calling filter: org.apache.sling.engine.impl.debug.RequestProgressTrackerLogFilter
2 (2013-04-04 15:12:56) LOG Calling filter: com.day.cq.wcm.mobile.core.impl.redirect.RedirectFilter
一部の古いフィルターは、このfilter.order
プロパティを使用します。これは、service.ranking プロパティが見つからない場合にのみ使用されます。SLING-1735を参照してください。
これは、ホワイトボード サポートを使用する Sling フィルターを使用する代わりに、標準の HTTP フィルターを使用することで解決されました - Apache Http Service Whiteboard 。ユーザーが認証された後に Sling フィルターが呼び出され、ロジックが機能するには、リクエストが Sling 認証レイヤーに到達する前にインターセプトする必要があります。したがって、それらを std Servlet Filter として登録する必要があります
@Component
@Service
@org.apache.felix.scr.annotations.Properties({
@Property(name = "pattern", value = "/.*"),
@Property(name = Constants.SERVICE_RANKING, intValue = 100000, propertyPrivate = false),
@Property(name = "_usernameHeader", value = "SM_USER")
})
public class TestFilter implements javax.servlet.Filter {