oauth2 做用户中心管理系统的疑问

2022-11-02 10:09:43 +08:00
 ChenSino

1 、背景

公司各种各样的系统太多,不同系统不同的账号密码,用户需要记很多账号密码,体验太差

2 、需求

现准备建立一个用户管理的系统,把用户管理都放在 oauth 授权服务器集中管理,准备用 oauth2 实现单点登录,但是如果用 oauth2,那么我如何控制各自系统的更细粒度的权限?比如控制各自系统的菜单权限、数据权限,是不是 授权服务器仅作基本的用户管理以及单点登录,各自业务系统之中也要维护一个 RBAC 权限控制的表?各自系统的更细粒度权限由业务系统自己实现?

3 、请吴彦祖们指点一下

有没有做过类似需求的老哥给点建议

3524 次点击
所在节点    程序员
30 条回复
luomao
2022-11-02 11:28:58 +08:00
@ChenSino 我也是这一套,按这个思路结合你们公司具体业务开发就 ok 了,加油
zzl22100048
2022-11-02 11:53:13 +08:00
用 oauth2 那套做登录标准流程是 OIDC ( OpenID Connect ),一般细粒度权限不在这里做
kaing
2022-11-02 15:39:23 +08:00
可以搜一下业权一体化相关的内容
siaronwang
2022-11-02 17:41:26 +08:00
casbin,casdoor
ChenSino
2022-11-10 14:25:35 +08:00
@luomao 老哥老哥,授权完成后,拿到 JWT ,这个 jwt 应该是不包含业务系统的权限吧,那业务系统的数据权限和菜单是如何处理呢?解析 jwt 拿到用户名,再根据用户名查询自己业务系统的权限吗?
luomao
2022-11-10 14:49:29 +08:00
@ChenSino 对,这里只有授权中心的用户信息。权限之类的完全可以在你的业务系统中拦截器中做,jwt 解析后获取到用户与租户信息,去业务系统中的缓存中查找是否有权限数据,没有就缓存一份到 Redis 中(提供一个接口给前端获取菜单渲染问题解决了),然后取缓存的权限写一份包含用户权限等的用户信息到 threadLocal 中,并设置子线程共享,这样在你的调用链路中任何位置的 threadLocal 都有用户信息。
权限也是基于 threadLocal 中的用户权限,实现几个注解(检验当前用户是否有角色、权限),然后用 aop 或者拦截器校验被注解方法上的权限值、角色值与 threadLocal 中的用户信息,不符合条件的就异常出去
ChenSino
2022-11-10 21:50:32 +08:00
@luomao 好的,明白了,感谢老哥。
ChenSino
2022-11-10 22:12:44 +08:00
非常感谢 @luomao 老哥提供的思路,按照老哥的思路,要重写 OAuth2AuthenticationProcessingFilter 过滤器其中获取 Authentication 这部分逻辑就可以了,
```java
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
ServletException {

final boolean debug = logger.isDebugEnabled();
final HttpServletRequest request = (HttpServletRequest) req;
final HttpServletResponse response = (HttpServletResponse) res;

try {
//重写这里,改成业务模块获取 Authentication 的逻辑,用 token 的话就是要重写 org.springframework.security.oauth2.provider.authentication.BearerTokenExtractor#extract 方法了

Authentication authentication = tokenExtractor.extract(request);

if (authentication == null) {
if (stateless && isAuthenticated()) {
if (debug) {
logger.debug("Clearing security context.");
}
SecurityContextHolder.clearContext();
}
if (debug) {
logger.debug("No token in request, will continue chain.");
}
}
……
```

我准备按照这个思路实践以下,java 小伙伴如果有类似问题可以做个参考,此贴终结了吧。
luomao
2022-11-11 09:19:55 +08:00
@ChenSino 后面我准备把我那套授权中心的代码开源出来,后续有仓库地址我更新到这个帖子中
ChenSino
2022-11-11 10:01:02 +08:00
@luomao 期待老哥的开源大作哈哈

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/891983

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX