私のアプリケーションは、認証に SSO サービスを使用するように設計されています。このシナリオは、Spring のドキュメントの Siteminder シナリオに似ています。ユーザーは、すでに認証されている SSO から取得されます。
ただし、ユーザーがアプリケーションにアクセスしてまだ認証されていない場合は、ユーザーを SSO ログイン フォームにリダイレクトしたいと考えています。
どうすればこれを達成できますか?
私のアプリケーションは、認証に SSO サービスを使用するように設計されています。このシナリオは、Spring のドキュメントの Siteminder シナリオに似ています。ユーザーは、すでに認証されている SSO から取得されます。
ただし、ユーザーがアプリケーションにアクセスしてまだ認証されていない場合は、ユーザーを SSO ログイン フォームにリダイレクトしたいと考えています。
どうすればこれを達成できますか?
custom-filter を使用することは、私が過去にこれを達成した方法でもあります。追加することの1つは、ユーザーが認証されていない場合、フォームログインがすでにssoページにリダイレクトできることです。
<http use-expressions="true">
<intercept-url pattern="/**" access="isFullyAuthenticated()"/>
<form-login login-page="${ssoPage}" authentication-failure-url="${ssoPage}"/>
<custom-filter ref="jeePreAuthenticatedFilter" position="PRE_AUTH_FILTER"/>
<logout invalidate-session="true" logout-success-url="/logout.jsp" delete-cookies="MYSubject"/>
</http>
<!-- J2EE pre-authentication -->
<beans:bean id="jeePreAuthenticatedFilter" class="com.example.MyCustomFilter">
<beans:property name="authenticationManager" ref="authenticationManager" />
</beans:bean>
<beans:bean id="authenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
<beans:property name="preAuthenticatedUserDetailsService" ref="preAuthenticatedUserDetailsService"/>
</beans:bean>
<beans:bean id="preAuthenticatedUserDetailsService" class="com.example.MyCustomUserDetailsService">
</beans:bean>
<authentication-manager alias="authenticationManager">
<authentication-provider ref="authenticationProvider" />
</authentication-manager>
class Http403Redirect extends Http403ForbiddenEntryPoint {
Logger log = LoggerFactory.getLogger(Http403Redirect.class)
@Override
public void commence(HttpServletRequest arg0, HttpServletResponse arg1, AuthenticationException arg2)
throws IOException ,ServletException {
arg1.setStatus(403)
arg1.sendRedirect("http://www.google.com/")
}
}
そして、私のサーブレット セキュリティ xml 構成では:
<beans:bean id="http403EntryPoint" class="com.opentext.infofusion.security.otds.Http403Redirect" />
<http use-expressions="true" auto-config="false" entry-point-ref="http403EntryPoint">
<intercept-url pattern="/**" access="hasRole('user')" />
<custom-filter ref="otdsFilter" position="PRE_AUTH_FILTER"/>
</http>
これはトリックを行うようです。