Pertanyaan Return Http Status (mis. 401) atau redirect Spring Security


Hai, saya menggunakan konfigurasi ini untuk Spring Security:

   <http auto-config="true" use-expressions="true">
        <session-management>
            <concurrency-control max-sessions="1" />
        </session-management>

        <form-login login-page="/login" login-processing-url="/resources/j_spring_security_check"  authentication-failure-url="/login?login_error=t"/>
        <logout logout-url="/resources/j_spring_security_logout"/>

        <intercept-url pattern="/resources/**" access="permitAll" />
        <intercept-url pattern="/login" access="permitAll" />

        <intercept-url pattern="/**" access="isAuthenticated()" />
    </http>

Saya harus kembali Http Error Code seperti 401 jika Content-Type dalam permintaan header saya adalah: application/json; kalau tidak saya ingin mengarahkan ulang ke Halaman Login.

Tetapi dengan konfigurasi ini, terlepas dari jenis permintaan konten saya sedang diarahkan untuk login url dengan 302 Kode respon..

Apakah ada cara untuk melakukan ini ??

EDIT: Saya ingin hanya menggunakan satu servlet untuk menangani html dan json, jadi saya coba ini:

@Component
public class CustomEntryPoint extends LoginUrlAuthenticationEntryPoint {

    private final Logger log = LoggerFactory.getLogger(CustomEntryPoint.class);

        public CustomEntryPoint(String loginFormUrl) {
            super(loginFormUrl);
        }

        @Override
        public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException)
                throws IOException, ServletException {

            if(request.getContentType() != null && request.getContentType().equals("application/json")) {
                 response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Access Denied");
            }else {
                super.commence(request, response, authException);
            }

        }
    }

Dan ini adalah Konfigurasi Keamanan saya yang baru:

<http auto-config="true" use-expressions="true" entry-point-ref="customEntryPoint">
    <session-management>
        <concurrency-control max-sessions="1" />
    </session-management>

    <form-login login-page="/login" login-processing-url="/resources/j_spring_security_check"  authentication-failure-url="/login?login_error=t"/>
    <logout logout-url="/resources/j_spring_security_logout"/>

    <intercept-url pattern="/resources/**" access="permitAll" />
    <intercept-url pattern="/login" access="permitAll" />

    <intercept-url pattern="/**" access="isAuthenticated()" />
</http>

<beans:bean id="customEntryPoint" class="x.x.CustomEntryPoint">
    <beans:constructor-arg value="/login"/>
</beans:bean>

Apa pendapatmu tentang itu? Ini adalah cara yang benar untuk melakukannya, atau apakah Anda tahu cara yang lebih baik?

Terima kasih


4
2017-07-30 08:11


asal


Jawaban:


Saya memecahkan dengan cara ini:

public class CustomEntryPoint extends LoginUrlAuthenticationEntryPoint {

    private static final String XML_HTTP_REQUEST = "XMLHttpRequest";
    private static final String X_REQUESTED_WITH = "X-Requested-With";

    public CustomEntryPoint(String loginFormUrl) {
        super(loginFormUrl);
    }

    @Override
    public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException exception)
            throws IOException, ServletException {
        if (XML_HTTP_REQUEST.equals(request.getHeader(X_REQUESTED_WITH))) {
            response.sendError(HttpServletResponse.SC_UNAUTHORIZED);
        } else {
            super.commence(request, response, exception);
        }
    }

}

Dan konfigurasi Keamanan adalah:

<http auto-config="true" use-expressions="true" entry-point-ref="customEntryPoint">
    <session-management>
        <concurrency-control max-sessions="1" />
    </session-management>

    <form-login login-page="/login" login-processing-url="/resources/j_spring_security_check"  authentication-failure-url="/login?login_error=t"/>
    <logout logout-url="/resources/j_spring_security_logout"/>

    <intercept-url pattern="/resources/**" access="permitAll" />
    <intercept-url pattern="/login" access="permitAll" />

    <intercept-url pattern="/**" access="isAuthenticated()" />
</http>

<beans:bean id="customEntryPoint" class="x.x.CustomEntryPoint">
    <beans:constructor-arg value="/login"/>
</beans:bean>

7
2017-07-30 09:38