Login dan logout keamanan musim semi

Saya ingin membuat aplikasi web menggunakan spring security, namun saya merasa ada yang salah atau kurang.

Ini kode saya:

keamanan.xml:

<beans:beans xmlns="http://www.springframework.org/schema/security"
xmlns:beans="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
       http://www.springframework.org/schema/security
       http://www.springframework.org/schema/security/spring-security.xsd">

<http use-expressions="true" disable-url-rewriting="true">
    <intercept-url pattern="/index.htm" access="hasRole('ROLE_ADMIN')" />
    <form-login login-processing-url="/login" login-page="/login.htm"
        username-parameter="userName" password-parameter="password"
        default-target-url="/index.htm" always-use-default-target="true"
        authentication-failure-url="/login.htm?auth=fail" />
    <logout logout-url="/logout.htm" logout-success-url="/login?out=1"
        delete-cookies="JSESSIONID" invalidate-session="true" />
</http>

<authentication-manager>
    <authentication-provider>
        <user-service>
            <user name="drs" password="123456" authorities="ROLE_ADMIN" />
            <user name="dr" password="123456" authorities="ROLE_USER" />
        </user-service>
    </authentication-provider>
</authentication-manager>
</beans:beans>

pengontrol:

@Controller
public class SecurityController {
    @RequestMapping(value = "/logout.htm", method = RequestMethod.GET)
    public String logoutPage() {
        return "logoutPage";
    }

    @RequestMapping(value = "/login.htm", method = RequestMethod.GET)
    public String login() {
        return "loginPage";
    }
}

login.jsp:

<form:form action="${pageContext.request.contextPath}/login" method="POST">
    <c:if test="${not empty param.err}">
        <div>
            <c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}" />
        </div>
    </c:if>
    <c:if test="${not empty param.out}">
        <div>You've logged out successfully.</div>
    </c:if>
    <c:if test="${not empty param.time}">
        <div>You've been logged out due to inactivity.</div>
    </c:if>

    Username:<br>
    <input type="text" name="userName" value="" />
    <br>
    <br> Password:<br>
    <input type="password" name="password" value="" />
    <input value="Login" name="submit" type="submit" />
</form:form>

logout.jsp:

<a href="/id${pageContext.request.contextPath}/login.htm">Login</a>

Ini berfungsi dengan baik, satu-satunya masalah adalah ketika saya menekan logout tidak melakukan apa pun, saya masih memiliki izin yang saya miliki setelah login. Biasanya itu harus kembali ke layar login, meminta pengguna untuk mengautentikasi untuk mengakses halaman itu. Apa yang saya lewatkan?

Dan satu masalah lagi yang tidak dapat saya pecahkan. Ketika saya mengubah formulir login:

<form:form action="${pageContext.request.contextPath}/login" method="POST">

to:

<form name='loginform' action="<c:url value='j_spring_security_check' />" method='POST'>

Saya mendapatkan kesalahan:

Status HTTP 404 - /Dronomy_2.1/j_spring_security_check

Ada yang bisa bantu saya?


person Drastaro    schedule 16.07.2015    source sumber
comment
Anda tidak akan /logout.htm saat mengeklik tautan Anda, pada dasarnya Anda tidak akan pernah keluar. Properti login-processing-url Anda disetel ke /login jadi saat mengirimkan formulir, Anda harus mengirimkan ke /login .   -  person M. Deinum    schedule 16.07.2015


Jawaban (3)


Dalam hal keluar dengan CSRF diaktifkan, dua tempat utama dalam kode Anda untuk ini adalah:

logout-url="/logout.htm"

Dan

@RequestMapping(value = "/logout.htm", method = RequestMethod.GET)

Saya kira Anda tidak perlu menyediakan halaman logout sendiri. Untuk melakukan logout, Anda memerlukan browser pengguna untuk melakukan POST ke /logout.htm. Dalam POST ini Anda perlu memasukkan nilai csrf Anda. POST ini ditujukan ke titik akhir keamanan pegas yang Anda konfigurasikan dengan logout-url="/logout.htm", dan bukan logout di pengontrol Anda.

dokumentasi musim semi menyediakan beberapa opsi tentang bagaimana Anda dapat melakukan ini. Salah satunya adalah dengan menyertakan formulir di semua halaman tempat pengguna Anda dapat logout, dan mengirimkan formulir dengan Javascript ketika pengguna mengklik link menu logout.

Jika Anda melakukan ini, Anda dapat menghapus pemetaan permintaan yang saya sebutkan di atas.

person geoff.weatherall    schedule 18.07.2015

Saya baru saja mengubah security.xml

<http use-expressions="true" disable-url-rewriting="true">
    <intercept-url pattern="/listUsers.htm" access="hasRole('ROLE_ADMIN')" />
    <intercept-url pattern="/play.htm" access="hasRole('ROLE_USER')" />
    <form-login login-page="/login.htm" login-processing-url="/j_spring_security_check"
        username-parameter="userName" password-parameter="password"
        default-target-url="/index.htm" always-use-default-target="true"
        authentication-failure-url="/login.htm?auth=fail" />
    <logout logout-url="/logout.htm" logout-success-url="/login.htm" />
</http>

ditambahkan

</c:if>
                <form method="post"
                    action="<c:url value='j_spring_security_check' />">

dan menghapus pengalihan untuk keluar dari pengontrol. Sekarang berfungsi dengan baik :)

person Drastaro    schedule 18.07.2015

Ini berfungsi dengan baik, satu-satunya masalah adalah ketika saya menekan logout tidak menghasilkan apa-apa

Anda baru saja mengarahkan pengguna ke halaman login. Sesi ini tidak dibatalkan. Objek SecurityContext tidak dihapus.

Anda perlu menggunakan keamanan pegas /j_spring_security_logout untuk mengeluarkan pengguna

<a href="/id/j_spring_security_logout">LogOut</a>

Lihat contoh ini

untuk formulir login Anda coba

<form name='loginform' action="<c:url value='/j_spring_security_check' />" method='POST'>

Kesalahan 404 yang terjadi umumnya terjadi karena perhitungan jalur konteks.

person underdog    schedule 16.07.2015
comment
Iya dan tidak. Dia mengonfigurasi ulang URL-nya sehingga URL default tidak berlaku lagi. - person M. Deinum; 16.07.2015
comment
Yah Deinum Saya samar-samar ingat masalahnya, terjadi dengan kode saya, perbaikannya adalah jalur konteks jadi tulis saja di jawabannya :) - person underdog; 16.07.2015
comment
jadi begitu. tetapi saya menggunakan formulir Anda, saya mendapatkan kesalahan token csrf: Status HTTP 403 - Token CSRF yang diharapkan tidak ditemukan. Apakah sesi Anda sudah habis? Dan ketika saya menekan tombol logout, saya hanya mendapatkan tautan ini: localhost:8080/j_spring_security_logout - person Drastaro; 16.07.2015