2013-03-06 114 views
0

我從我的上一個Get authenticated user entity Spring MVC創建此主題,我問了關於正確獲取經過身份驗證的用戶實體的問題。我建議,如果我的UserDetailsS​​ervice配置是正確的,則Principal對象(例如,在我的視圖<sec:authentication property="principal.customFieldName" />中)可以訪問我的自定義字段。我的UserDetailsS​​ervice配置是否正確完成此功能?UserDetailsS​​ervice配置正確獲取用戶

@Service("userDetailsService") 
public class UserDetailsServiceImpl implements UserDetailsService { 
    private static final Logger logger = Logger.getLogger(UserDetailsServiceImpl.class); 

    @Autowired 
    @Qualifier("hibernateUserDao") 
    private UserDAO userDAO; 

    @Override 
    @Transactional(readOnly = true) 
    public org.springframework.security.core.userdetails.UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException, DataAccessException { 
     UserDetails user = userDAO.findByLogin(userName); 

     if (user == null) { 
      logger.error("User was not found! Input login: " + userName); 
     } 

     return buildUserFormUserEntity(user); 
    } 

    @Transactional(readOnly = true) 
    private org.springframework.security.core.userdetails.User buildUserFormUserEntity(UserDetails userDetails) { 
     boolean enableStatus = userDetails.isEnabled(); 
     String userName = userDetails.getLogin(); 
     String password = userDetails.getPassword(); 
     boolean enabled = enableStatus; 
     boolean accountNonExpired = enableStatus; 
     boolean credentialsNonExpired = enableStatus; 
     boolean accountNonLocked = enableStatus; 

     Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>(); 
     authorities.add(new SimpleGrantedAuthority(userDetails.getRole())); 

     User springSecurityUser = new User(userName, password, enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, authorities); 
     return springSecurityUser; 
    } 

    public UserDAO getUserDAO() { 
     return userDAO; 
    } 

    public void setUserDAO(UserDAO userDAO) { 
     this.userDAO = userDAO; 
    } 
} 

回答

1

我想你需要一些額外的步驟,以便能夠有些頁面上成功地使用

<sec:authentication property="principal.customFieldName" /> 

  1. 添加實現org.springframework.security.core.userdetails.UserDetails界面自定義用戶對象。最簡單的方法是擴展現有的org.springframework.security.core.userdetails.User類:class CutomUser extends User
  2. 將您的customFieldName屬性添加到CutomUser類。
  3. UserDetailsServiceImpl.loadUserByUsername(...)方法中使用CutomUser作爲返回類型。此時不要忘記填寫customFieldName
+0

但是我已經有了這個方法。不會干預舊的新方法嗎? – sidlejinks 2013-03-06 15:03:14

+0

對不起,看起來我錯過了它。你的UserDetailsS​​ervice類配置得很好。只有一個問題:你在哪裏設置你的'customFieldName'屬性的值? – 2013-03-06 15:37:13

+0

對不起,但我應該在哪裏設置?我不知道...... – sidlejinks 2013-03-06 15:40:35

相關問題