Java ve Spring 3'te oldukça yeni (çoğunlukla 8 yıldır kullanılan PHP). Ben tüm varsayılan userDetails ve userDetailsService çalışmak için bahar güvenliğini 3 halletmiş ve ben kullanarak bir denetleyici içinde kullanıcıya ait kullanıcı oturum erişebilirsiniz biliyorum:Spring Security: özel kullanıcı hesaplamaları
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName(); //get logged in username
Ama iki sorun ben rakam yapamam vardır dışarı:
diğer kullanıcı bilgileri bir sürü ben saklı edilmesini istediğiniz vardır zaman (vb DOB, cinsiyet, gibi) ve daha sonra kontrolörleri aracılığıyla erişilebilir şekilde bir kullanıcı günlükleri. Oluşturulan userDetails nesnesinin özel alanlarmı içerecek şekilde ne yapmam gerekiyor?
Zaten "HttpSession session = request.getSession (true); benim denetleyicideki her yöntemimin üstünde. Oturum açmış kullanıcının userDetails'ını oturum açtıktan sonra bir oturumda saklamak mümkün mü? "Kimlik doğrulama auth = SecurityContextHolder.getContext(). GetAuthentication();" her yöntemin başında?
Güvenlik-applicationContext.xml:
<global-method-security secured-annotations="enabled"></global-method-security>
<http auto-config='true' access-denied-page="/access-denied.html">
<!-- NO RESTRICTIONS -->
<intercept-url pattern="/login.html" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<intercept-url pattern="/*.html" access="IS_AUTHENTICATED_ANONYMOUSLY" />
<!-- RESTRICTED PAGES -->
<intercept-url pattern="/admin/*.html" access="ROLE_ADMIN" />
<intercept-url pattern="/member/*.html" access="ROLE_ADMIN, ROLE_STAFF" />
<form-login login-page="/login.html"
login-processing-url="/loginProcess"
authentication-failure-url="/login.html?login_error=1"
default-target-url="/member/home.html" />
<logout logout-success-url="/login.html"/>
</http>
<authentication-manager>
<authentication-provider>
<jdbc-user-service data-source-ref="dataSource" authorities-by-username-query="SELECT U.username, UR.authority, U.userid FROM users U, userroles UR WHERE U.username=? AND U.roleid=UR.roleid LIMIT 1" />
<password-encoder hash="md5"/>
</authentication-provider>
</authentication-manager>
login.jsp'ye:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib uri="http://tiles.apache.org/tags-tiles" prefix="tiles" %>
<%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
<tiles:insertDefinition name="header" />
<tiles:insertDefinition name="menu" />
<tiles:insertDefinition name="prebody" />
<h1>Login</h1>
<c:if test="${not empty param.login_error}">
<font color="red"><c:out value="${SPRING_SECURITY_LAST_EXCEPTION.message}"/>.<br /><br /></font>
</c:if>
<form name="f" action="<c:url value='/loginProcess'/>" method="POST">
<table>
<tr><td>User:</td><td><input type='text' name='j_username' value='<c:if test="${not empty param.login_error}"><c:out value="${SPRING_SECURITY_LAST_USERNAME}"/></c:if>' /></td></tr>
<tr><td>Password:</td><td><input type='password' name='j_password' /></td></tr>
<tr><td> </td><td><input type="checkbox" name="_spring_security_remember_me" /> Remember Me</td></tr>
<tr><td> </td><td><input name="submit" type="submit" value="Login" /></td></tr>
</table>
</form>
<tiles:insertDefinition name="postbody" />
<tiles:insertDefinition name="footer" />
Teşekkür Kent, bu oldukça yardımcı oldu! Dağınıklık için özür dilerim, ilk kez Baharı kodluyorum. 2 numaralı yaklaşımı severim, her bir yöntemin başlangıcında bu kod satırını nereye koyarım? Ve bu soruya dayanarak tahmin ediyorum, eğer bu 2. yaklaşımla gidersem kullanıcı nesnesini saklamak mümkün olmaz. Yeni bir kullanıcı nesnesi oluşturup her seferinde aynı veri için db'ye gitmeli mi? – Felix
Cevap, "bağlıdır". 2 numaralı yaklaşımla, bir kullanıcının hesabına çok nadiren erişmem gerekiyor (bir alan perspektifinden). Belki de sadece "profillerini" görüntüleme veya düzenleme amacıyla erişirim. Bu durumda, gerektiğinde bu bilgi için veri deposunu okurum. Bununla birlikte, kullanıcının özniteliklerine sık sık erişmeniz gerekiyorsa (etki alanı perspektifinden, belki de kullanıcı nesnesinin bazı özniteliğinin üstbilgide görünmesi gerekir ve bu nedenle her istekte gerekir), muhtemelen yeniden gözden geçirmeniz gerekir yaklaşım # 1. –
Teşekkür Kent. Hibrit bir çözüm geliştirdim. Giriş yapmış olan kullanıcıya ihtiyacım olduğunda, verileri elde etmek için bir sarmalayıcı denetleyicisinde bir yöntem çalıştırıyorum. Yöntem, oturumun bir kullanıcı nesnesi içerip içermediğini kontrol eder ve eğer yaparsa, kullanıcının kullanıcı adı, SecurityContext kullanıcı adının değerine eşit olup olmadığını kontrol eder. Değilse (veya oturum kullanıcısı nesnesi boşsa), kullanıcı verilerini veritabanından alır ve nesneyi oturum halinde kaydeder. İki ekstra if ifadesi, ancak 1 daha az veritabanı çağrısı. – Felix