私の質問はちょっと奇妙に思えるかもしれませんが、Spring Security がどのように機能するかをよりよく理解したいと思います。
私は次のようなシナリオを持っています...
Spring SecurityとSpring SAMLを使用して、 httpリクエストを適切に管理するために、エントリ ポイント、いくつかのパターン、およびフィルターを定義しました。
<!-- Secured pages -->
<security:http entry-point-ref="samlEntryPoint"
use-expressions="true">
<security:intercept-url pattern="/" access="permitAll" />
<security:intercept-url pattern="/saml/**" access="permitAll" />
<security:intercept-url pattern="/metadata" access="permitAll" />
<security:intercept-url pattern="/metadata/**" access="permitAll" />
<security:intercept-url pattern="/info" access="isAuthenticated()" />
<security:intercept-url pattern="/signup/sso" access="permitAll" />
<security:custom-filter before="FIRST"
ref="metadataGeneratorFilter" />
<security:custom-filter after="BASIC_AUTH_FILTER"
ref="samlFilter" />
</security:http>
<bean id="samlFilter" class="org.springframework.security.web.FilterChainProxy">
<security:filter-chain-map request-matcher="ant">
<security:filter-chain pattern="/saml/login/**"
filters="samlEntryPoint" />
<security:filter-chain pattern="/saml/logout/**"
filters="samlLogoutFilter" />
<security:filter-chain pattern="/saml/metadata/**"
filters="metadataDisplayFilter" />
<security:filter-chain pattern="/saml/SSO/**"
filters="samlWebSSOProcessingFilter" />
<security:filter-chain pattern="/saml/SSOHoK/**"
filters="samlWebSSOHoKProcessingFilter" />
<security:filter-chain pattern="/saml/SingleLogout/**"
filters="samlLogoutProcessingFilter" />
<security:filter-chain pattern="/saml/discovery/**"
filters="samlIDPDiscovery" />
</security:filter-chain-map>
</bean>
次に、IdP 検出サービスも定義しました。
<!-- IDP Discovery Service -->
<bean id="samlIDPDiscovery" class="org.springframework.security.saml.SAMLDiscovery">
<property name="idpSelectionPath" value="/sso/idpSelection" />
</bean>
最後に、http リクエストを処理するWeb コントローラー/sso/idpSelection
を実装しました。
@Controller
@RequestMapping("/sso")
public class SSOController {
// Logger
private static final Logger LOG = LoggerFactory.getLogger(SSOController.class);
@Autowired
private ServletContext servletContext;
@RequestMapping(value = "/idpSelection", method = RequestMethod.GET)
public String idpSelection(HttpServletRequest request, Model model) {
WebApplicationContext context = WebApplicationContextUtils
.getWebApplicationContext(request.getServletContext());
MetadataManager metadataManager = context.getBean("metadata", MetadataManager.class);
Set<String> idps = metadataManager.getIDPEntityNames();
for (String idp : idps)
LOG.info("Configured Identity Provider for SSO: " + idp);
model.addAttribute("idp", idps);
return "sso/idpselection";
}
}
匿名ユーザーが保護されたページにアクセスしようとすると、フィルターがその要求を にリダイレクトする/saml/discovery
ため、IdP ディスカバリー サービスはコントローラーを呼び出します/sso/idpSelection
。
内部リソースとして、ルート/sso/idpSelection
が IdP ディスカバリー サービスによってのみ使用されるべきであることは明らかです。
直接アクセス リクエスト (ブラウザなどによる) を拒否すると同時に、内部プロセスのルートを許可する方法はありますか?