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