我一直在努力解决这个问题。
我有一个多租户系统,用户被组织到组织中。在该组织内,用户名必须是唯一的。否则,两个组织可以具有相同的用户名。
我已经使用jdbc-user-service连接了spring security,并且一切正常。当我试图获得当前用户时,我的问题开始了。
我查看了a link,它利用spring 3和Principal对象作为方法参数。这很有效,除了校长没有足够的信息!首先,用户名在我的用例中不是唯一的,也可以轻松访问用户所属的组织。
再多搜索一下this非常棒的答案。这个问题与以前一样。它依赖于Principal对象,它没有足够的信息。
(这是魔术)
@Override
public Object resolveArgument(MethodParameter methodParameter,
ModelAndViewContainer mavContainer,
NativeWebRequest webRequest,
WebDataBinderFactory binderFactory) throws Exception {
if (this.supportsParameter(methodParameter)) {
Principal principal = webRequest.getUserPrincipal();
return (User) ((Authentication) principal).getPrincipal();
} else {
return WebArgumentResolver.UNRESOLVED;
}
}
是否有一种好方法可以覆盖User对象以使用我自己的对象?我是不是写了自定义UserDetailService?有没有比继续走这条道路更好的方法?
由于
答案 0 :(得分:0)
使您的User对象继承UserDetails(或使用包装器)并将其用作主体。
e.g。
public class MyCustomUser implements UserDetails {
// ..
}
创建一个返回User对象的自定义UserDetailsService:
@Service
public class MyCustomUserDetailsServiceImpl implements UserDetailsService {
@Autowired
private MyCustomUserDAO userDAO;
@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
return userDAO.getByUsername(username);
}
}
现在您可以提取您的用户:
Authentication auth = SecurityContextHolder.getContext().getAuthentication();
Object principal = auth.getPrincipal();
MyCustomUser user = (MyCustomUser)principal;
user.myCustomMethod();