1

私は春のセキュリティに慣れていないので、よくある質問や他のサイトにとって難しすぎる質問があるようです。

タスクは次のとおりです。

  1. ログインフォーム付きの春のアプリがあります。すべてがうまくいきます。

  2. ここで、アプリから許可されたページを取得する機能が必要ですが、URL 経由で認証を行う必要があります... http://myapp.de?login=test&password=testのようなものです。PRE_AUTH_FILTER で作りました。すべてが URL で機能します。

  3. 問題は、アプリで両方の認証方法が必要なことです。PRE_AUTH_FILTER が失敗した場合、標準のログイン フォームが読み込まれるとします。だから: http: //myapp.deは私のログインフォームとポイント1)を表示します。

現在、私のセキュリティ構成では、 PRE_AUTH_FILTER しか機能していません。

私は何を取りこぼしたか?

<sec:http auto-config="true" use-expressions="true">
    <sec:form-login login-page="/login.jsp" default-target-url="/start" authentication-failure-url="/login.jsp?error=true"/>
    <sec:logout logout-url="/logout" logout-success-url="/login.jsp"/>
    <sec:anonymous username="guest" granted-authority="ROLE_ANONYMOUS"/>
    <sec:access-denied-handler error-page="/error403.jsp"/>
    <sec:intercept-url pattern="/login*" access="permitAll"/>   
    <sec:intercept-url pattern="/objautocomplete*" access="hasRole('ROLE_USER')"/>
    <sec:intercept-url pattern="/start*" access="hasRole('ROLE_USER')"/>
    <sec:intercept-url pattern="/u*" access="hasRole('ROLE_USER')"/>
    <sec:intercept-url pattern="/crosstable*" access="hasRole('ROLE_USER')"/>
    <sec:intercept-url pattern="/objcen*" access="hasRole('ROLE_USER')"/>
    <sec:intercept-url pattern="/objchecks*" access="hasRole('ROLE_USER')"/>
    <sec:intercept-url pattern="/globalcen*" access="hasRole('ROLE_USER')"/>
    <sec:custom-filter position="PRE_AUTH_FILTER" ref="preAuthFilter" />
    <sec:remember-me/>
</sec:http>

    <!-- PRE_ AUTHENTICATION -->        
<beans:bean id="userDetailsServiceImpl"
    class="com.grsnet.qvs.auth.UserDetailsServiceImpl" />

<beans:bean id="preAuthenticatedProcessingFilterEntryPoint"
    class="com.grsnet.qvs.auth.LinkForbiddenEntryPoint" />

<beans:bean id="preAuthenticationProvider" class="org.springframework.security.web.authentication.preauth.PreAuthenticatedAuthenticationProvider">
    <beans:property name="preAuthenticatedUserDetailsService" ref="userDetailsServiceImpl" />
</beans:bean>

<beans:bean id="preAuthFilter"
    class="com.grsnet.qvs.auth.UrlParametersAuthenticationFilter">
    <beans:property name="authenticationManager" ref="appControlAuthenticationManager" />
</beans:bean>

<sec:authentication-manager alias="appControlAuthenticationManager">
    <sec:authentication-provider ref="preAuthenticationProvider" />
</sec:authentication-manager>

    <!-- LOGIN FORM AUTHENTICATION -->  

<sec:authentication-manager>
    <sec:authentication-provider user-service-ref="qvsUserDetailsService"/>
</sec:authentication-manager>

<beans:bean id="qvsUserDetailsService" class="com.grsnet.qvs.auth.QVSUserDetailsService"/>

</beans:beans>

UPDATE UrlParametersAuthenticationFilter.java

public class UrlParametersAuthenticationFilter extends AbstractPreAuthenticatedProcessingFilter {

    @Override
    protected Object getPreAuthenticatedPrincipal(HttpServletRequest request) {
        if (request.getParameterMap().size() == 2) {
            return true;
        }
        return false;
    }

    @Override
    protected Object getPreAuthenticatedCredentials(HttpServletRequest request) {
        String[] credentials = new String[2];
        credentials[0] = request.getParameter("j_username");
        credentials[1] = request.getParameter("j_password");
        return credentials;
    }
}
4

1 に答える 1

1
<sec:custom-filter before="FORM_LOGIN_FILTER" ref="preAuthFilter" />

編集:

うーん、フィルターがゴチャゴチャ。AbstractPreAuthenticatedProcessingFilter の javadoc またはソースを見ましたか? PreAuthentication は、外部システムがすでに認証を行っている場合に使用されます。たとえば、コンテナーによって提供される Java EE 認証を使用する場合、または NTLM/kerberos の IIS を前面に出すなど、認証を行う Web フロントがある場合です。

また、間違って実装したため、getPreAuthenticatedPrincipal() はユーザー名 (別名プリンシパル) を返し、getPreAuthenticatedCredentials はパスワード (別名 Credentials) を返す必要があります。しかし、もっと重要なことは、AbstractPreAuthenticatedProcessingFilterが認証を行わないことです。Javadoc の最初の行から:

Base class for processing filters that handle pre-authenticated authentication requests, where it is assumed that the principal has already been authenticated by an external system.

したがって、フィルターを破棄して、標準の UsernamePasswordAuthenticationFilter を使用します

<beans:bean id="urlParameterAuthFilter" class="org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter">
    <beans:property name="usernameParameter" value="username" />
    <beans:property name="passwordParameter" value="password" />
    <beans:property name="postOnly" value="false" />
    <beans:property name="authenticationManager" ref="appControlAuthenticationManager" />
</beans:bean>

次に、カスタム フィルター宣言を次のように置き換えます。

<sec:custom-filter before="FORM_LOGIN_FILTER" ref="urlParameterAuthFilter" />

免責事項: URL でパスワードを渡すことは本当に悪い考えであり、最初から行うべきではありません。これはアクセス ログに表示され、非常に不要なセキュリティ上の問題が大量に発生します。

于 2012-08-29T10:21:13.673 に答える