2013-03-06 123 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

相关问题