मैं जावा और वसंत 3 के लिए काफी नया हूं (मुख्य रूप से पिछले 8 वर्षों में PHP का उपयोग किया जाता है)। मैं सभी डिफ़ॉल्ट userDetails और userDetailsService साथ काम करने के वसंत सुरक्षा 3 मिल गया है और मुझे लगता है मैं का उपयोग कर एक नियंत्रक में उपयोगकर्ता के उपयोगकर्ता नाम में लॉग इन का उपयोग कर सकते पता है:वसंत सुरक्षा: कस्टम उपयोगकर्ता विवरण
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
String username = auth.getName(); //get logged in username
लेकिन दो समस्याओं मैं समझ नहीं सकता देखते हैं आउट:
वहाँ अन्य उपयोगकर्ता जानकारी का एक बहुत मैं संग्रहीत करना चाहते हैं, जब (जैसे जन्म तिथि, लिंग, आदि के रूप में) और बाद में नियंत्रक के माध्यम से सुलभ होने के लिए किसी उपयोगकर्ता के लॉग। मुझे ऐसा करने की क्या ज़रूरत है ताकि उपयोगकर्ता द्वारा निर्मित ऑब्जेक्ट डिस्प्ले ऑब्जेक्ट में मेरे कस्टम फ़ील्ड हों?
मैं पहले से ही "Http सत्र सत्र = request.getSession (सत्य)" कह रहा हूं; " मेरे नियंत्रक में मेरे प्रत्येक तरीके के शीर्ष पर। लॉग इन पर लॉग इन करने के लिए उपयोगकर्ता के उपयोगकर्ता में लॉग इन करना संभव है ताकि मुझे "प्रमाणीकरण auth = SecurityContextHolder.getContext() को कॉल करने की आवश्यकता न हो। प्रमाणीकरण();" हर विधि की शुरुआत में?
सुरक्षा-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:
<%@ 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" />
धन्यवाद केंट, यह काफी मददगार था! गड़बड़ी के लिए खेद है, पहली बार वसंत कोडिंग। मुझे दृष्टिकोण # 2 पसंद है, मैं प्रत्येक विधि की शुरुआत में कोड की उस पंक्ति को कहां रखूंगा? और मुझे लगता है कि उस प्रश्न के आधार पर, यदि मैं उस दूसरे दृष्टिकोण के साथ जाता हूं तो उपयोगकर्ता ऑब्जेक्ट को स्टोर करना संभव है ताकि मैं ' टी को एक नया उपयोगकर्ता ऑब्जेक्ट बनाने की आवश्यकता है और प्रत्येक बार एक ही डेटा के लिए डीबी पर जाना है? – Felix
उत्तर है, "यह निर्भर करता है।" मुझे लगता है कि दृष्टिकोण # 2 के साथ, मुझे शायद ही कभी किसी उपयोगकर्ता के खाते (डोमेन परिप्रेक्ष्य से) तक पहुंचने की आवश्यकता होती है। हो सकता है कि मैं इसे केवल "प्रोफ़ाइल" प्रदर्शित करने या संपादित करने के प्रयोजनों के लिए एक्सेस करूं। यदि ऐसा है, तो जब आवश्यक हो तो मैं इस जानकारी के लिए डेटास्टोर को पढ़ूंगा। यदि, हालांकि, आपको अक्सर उपयोगकर्ता के गुणों (डोमेन परिप्रेक्ष्य से) तक पहुंचने की आवश्यकता होती है; शायद उपयोगकर्ता ऑब्जेक्ट की कुछ विशेषता शीर्षलेख में दिखाई देने की आवश्यकता होती है, और इसलिए प्रत्येक अनुरोध में इसकी आवश्यकता होती है), तो आपको शायद पुनर्विचार करना चाहिए दृष्टिकोण # 1। –
धन्यवाद केंट। मैं एक संकर प्रकार समाधान कर समाप्त हो गया। जब मुझे लॉग इन उपयोगकर्ता की आवश्यकता होती है तो मैं डेटा प्राप्त करने के लिए एक रैपर नियंत्रक में एक विधि चलाता हूं। विधि यह देखने के लिए जांचती है कि सत्र में उपयोगकर्ता ऑब्जेक्ट है या नहीं, और यदि यह जांचता है कि ऑब्जेक्ट का उपयोगकर्ता नाम सुरक्षा कॉन्टेक्स्ट उपयोगकर्ता नाम के बराबर है या नहीं। यदि नहीं (या यदि सत्र उपयोगकर्ता ऑब्जेक्ट शून्य है) तो यह डेटाबेस से उपयोगकर्ता डेटा प्राप्त करता है और ऑब्जेक्ट को सत्र में संग्रहीत करता है। कथन दो अतिरिक्त, लेकिन 1 कम डेटाबेस कॉल। – Felix