3

私の質問はちょっと奇妙に思えるかもしれませんが、Spring Security がどのように機能するかをよりよく理解したいと思います。

私は次のようなシナリオを持っています...

Spring SecuritySpring 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 ディスカバリー サービスによってのみ使用されるべきであることは明らかです。

直接アクセス リクエスト (ブラウザなどによる) を拒否すると同時に、内部プロセスのルートを許可する方法はありますか?

4

1 に答える 1

3

SAMLDiscovery は、ユーザーを /sso/idpSelection に送信するときに転送を行います。これは、以下を使用して、ユーザーがページに直接アクセスすることをプログラムで禁止できることを意味します。

@RequestMapping(value = "/idpSelection", method = RequestMethod.GET)
public String idpSelection(HttpServletRequest request, Model model) {  
   if (request.getAttribute("javax.servlet.forward.request_uri") == null) {
       // Deny access
   }
   ...
}

属性「javax.servlet.forward.request_uri」は、requestDispatcher の forward メソッドの呼び出し中にコンテナーによって自動的に設定されるため、直接の要求には存在しません。この機能は、Servlet 2.4 以降で使用できます。

于 2014-05-01T14:08:28.400 に答える