gpt4 book ai didi

java - Spring Security 数据库身份验证将 Spring 用户转换为域用户

转载 作者:太空宇宙 更新时间:2023-11-04 07:08:38 25 4
gpt4 key购买 nike

我在解决这个问题时遇到了一些麻烦。

我有一个 Multi-Tenancy 系统,其中用户被组织成组织。在该组织内,用户名必须是唯一的。否则,两个组织可以具有相同的用户名。

我已经将 spring security 与 jdbc-user-service 连接起来,一切正常。当我尝试获取当前用户时,我的问题就开始了。

我看了一下a link利用 spring 3 和Principal 对象作为方法参数。这很有效,但校长没有足够的信息!首先,用户名在我的用例中并不唯一,而且能够轻松访问用户所属的组织也很棒。

更多的搜索发现了this很棒的答案。这个问题和之前的问题是一样的。它依赖于主体对象,但它没有足够的信息。

(这就是魔法)

@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?还有比继续沿着这条路走更好的方法吗?

谢谢

最佳答案

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

例如

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

关于java - Spring Security 数据库身份验证将 Spring 用户转换为域用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20958651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com