2015-05-19 95 views
0

我使用Spring Security爲我的Spring MVC Web應用程序處理用戶身份驗證。我能夠從認證對象獲得用戶名,但我的用戶名是電子郵件地址,我希望能夠在我的標題中顯示用戶的實際名稱。Spring - 在JSTL中調​​用服務方法

所以,我有我的自定義用戶等級:

class Users{ 

    String name; 
    String email; 
    String password; 

    // getters and setters 
} 

我想過使用一個AOP範圍代理來設置用戶的會話,如在本博客中解釋:http://richardchesterwood.blogspot.co.uk/2011/03/using-sessions-in-spring-mvc-including.html。我使用這種方法面臨的問題是AuthenticationSuccessHandler實際上是一個Service,應該是無狀態的。所以Spring不會在服務中爲我自動裝載用戶對象。

所以我創建了一個Service方法,它將從Authentication對象獲取用戶名(或電子郵件)並返回我的Users對象。這我可以在我的控制器中使用。

@Service 
@Transactional 
public class UserServiceImpl implements UserService { 

@Override 
public Users getCurrentUser() { 
    Authentication auth = SecurityContextHolder.getContext().getAuthentication(); 

    User userD = (User)auth.getPrincipal(); 

    Users currentUser = getUserByEmail(userD.getUsername()); 

    return currentUser; 
} 

} 

那麼,有沒有,我可以打電話從JSTL這種服務方法來獲取用戶的全名,我可以在我的標題顯示的方式?

我也樂於提供更好的實現方法。

編輯:

在我以前使用AuthenticationSuccessHandler辦法,我的代碼是這樣的:

@Service("userDetailsService") 
@Transactional 
public class UserAuthenticationServiceImpl implements AuthenticationSuccessHandler { 

@Autowired 
Users currentUser; 

@Override 
public void onAuthenticationSuccess(HttpServletRequest hsr, HttpServletResponse hsr1, Authentication a) throws IOException, ServletException { 
    User user = (User) a.getPrincipal(); 

    Users user1 = userDao.getUserByEmail(user.getUsername()); 

    currentUser.setName(user1.getName()); 
    currentUser.setUserRoles(user1.getUserRoles()); 

    //currentUser = user1; 

} 

} 

在我的春天servlet.xml文件,我有這樣的:

<bean id="currentUser" class="com.foo.bean.Users" scope="session"> 
    <!-- this next element effects the proxying of the surrounding bean --> 
    <aop:scoped-proxy/> 
</bean> 

我在這裏面臨的問題是Spring不會自動裝配我的currentUser對象,因爲服務不在會話範圍內。

+0

從Spring Security中創建一個自定義的'User'而不是默認的''User'',它包含這些信息並修改表達式。你不應該像現在這樣做,你每次頁面渲染時都不需要額外的查詢和複雜性。 –

+0

謝謝Deinum。我在哪裏告訴Spring Security使用我的自定義User類呢? –

+0

第二個想法是,如果你已經有一個'AuthenticationSuccessHandler',爲什麼不簡單地使用它來獲取你需要的信息並將它存儲在會話中。你擁有所有你需要的方法來完成那個方法。 –

回答

1

如果您唯一需要的是全名,那麼只需使用AuthenticationSuccessHandler來檢索用戶並將名稱添加到會話中(或者如果您需要更多的話,可以使用完整用戶名)。

@Override 
public void onAuthenticationSuccess(HttpServletRequest req, HttpServletResponse res, Authentication auth) throws IOException, ServletException { 

    User user = (User) auth.getPrincipal(); 
    Users user1 = userDao.getUserByEmail(user.getUsername()); 
    WebUtils.setSessionAttribute(req, "currentUser" user1); 
} 

然後在你的JSP中,你需要的唯一東西是${currentUser.username}

儘管我不會在會話中提出填充完整用戶的建議,但我會建議僅添加所需的信息。

WebUtils.setSessionAttribute(req, "currentUsername" user1.getUsername()); 

然後在你的JSP ${currentUsername}爲您節省大量的會話的序列化的開銷。