Spring UserDetails用于正确获取用户信息的服务配置

Spring UserDetails用于正确获取用户信息的服务配置,spring,spring-security,Spring,Spring Security,我从上一个主题创建了这个主题,在这个主题中,我问了一个关于正确获取经过身份验证的用户实体的问题。我建议,如果我的UserDetailsService配置正确,主体对象(例如,在我的视图上)可以访问我的自定义字段。我的UserDetailsService是否正确配置以完成此功能 @Service("userDetailsService") public class UserDetailsServiceImpl implements UserDetailsService { private

我从上一个主题创建了这个主题,在这个主题中,我问了一个关于正确获取经过身份验证的用户实体的问题。我建议,如果我的UserDetailsService配置正确,主体对象(例如,在我的视图上)可以访问我的自定义字段。我的UserDetailsService是否正确配置以完成此功能

@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;
    }
}
@Service(“userdetailssservice”)
公共类UserDetailsServiceImpl实现UserDetailsService{
私有静态最终记录器Logger=Logger.getLogger(UserDetailsServiceImpl.class);
@自动连线
@限定符(“hibernateUserDao”)
私有UserDAO UserDAO;
@凌驾
@事务(只读=真)
public org.springframework.security.core.userdetails.userdetails loadUserByUsername(字符串用户名)抛出UsernameNotFoundException、DataAccessException{
UserDetails user=userDAO.findByLogin(用户名);
if(user==null){
logger.error(“未找到用户!输入登录名:“+用户名”);
}
返回buildUserFormUserEntity(用户);
}
@事务(只读=真)
private org.springframework.security.core.userdetails.User buildUserFormUserEntity(userdetails userdetails){
boolean enableStatus=userDetails.isEnabled();
字符串userName=userDetails.getLogin();
字符串password=userDetails.getPassword();
布尔启用=启用状态;
布尔AccountNoneExpired=启用状态;
布尔CredentialsNoneExpired=启用状态;
布尔值accountNonLocked=启用状态;
收集权限=新建ArrayList();
添加(新的SimpleGrantedAuthority(userDetails.getRole());
用户springSecurityUser=新用户(用户名、密码、已启用、AccountNoExpired、CredentialsNoExpired、AccountNoLocked、权限);
返回springSecurityUser;
}
公共UserDAO getUserDAO(){
返回userDAO;
}
公共void setUserDAO(UserDAO UserDAO){
this.userDAO=userDAO;
}
}

我认为您需要一些额外的步骤才能成功地使用

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

在某些页面上:

  • 添加实现
    org.springframework.security.core.userdetails.userdetails
    接口的自定义用户对象。最简单的方法是扩展现有的
    org.springframework.security.core.userdetails.User
    class:
    class-CutomUser-extensed-User
  • customFieldName
    属性添加到
    CutomUser
  • UserDetailsServiceImpl.loadUserByUsername(…)
    方法中使用
    CutomUser
    作为返回类型。此时不要忘记填写
    customFieldName

  • 但是我已经有了这个方法。不会干扰旧的新方法吗?对不起,我好像错过了。您的UserDetailsService类配置正确。只有一个问题:您在哪里设置
    customFieldName
    属性的值?在
    loadUserByUsername
    method中的某个地方,但这个值是动态设置的。或者只是我理解得不够。您能给我举个小例子吗?您的意思是当用户登录时,
    user.usercompanys
    的内容可能会更改?