Spring Security Database认证将Spring用户转换为域用户

时间:2014-01-06 20:27:15

标签: java spring spring-security

我一直在努力解决这个问题。

我有一个多租户系统,用户被组织到组织中。在该组织内,用户名必须是唯一的。否则,两个组织可以具有相同的用户名。

我已经使用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?有没有比继续走这条道路更好的方法?

由于

1 个答案:

答案 0 :(得分:0)

使您的User对象继承UserDetails(或使用包装器)并将其用作主体。

e.g。

public class MyCustomUser implements UserDetails {
    // ..
}

创建一个返回User对象的自定义UserDetailsS​​ervice:

@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();