Shiro 能否 在用户拥有 多角色情况下,指定某一个角色登录

banditgao 2019-09-26 02:55:13
以前用shiro做过一个账号一个角色登录,这个没问题。

但是新系统,
一个用户拥有多个角色,但在登录时必须选择其中一个角色(预先检查然后弹出角色选择窗)
然后想用Shiro只登录指定的角色(也就是仅拥有该角色的功能权限

不知道能否做到?怎么做到的?

...全文
3914 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
winco304 2021-07-07
  • 打赏
  • 举报
回复

请教一下:按照你这个实际的逻辑,怎样在选择角色窗口后再次调用执行realm的doGetAuthorizationInfo的方法来赋予角色权限

banditgao 2020-11-24
  • 打赏
  • 举报
回复
引用 7 楼 舔信封的MAN 的回复:
我也遇到类似问题了感谢博主写了这篇帖子,有个问题能解释一下CbRole这个类吗,我想了解一下如果指定角色不是null后,是如何操作的
cbRole 就是个实体啊,只有两种选择,不是未登陆的指定角色,就是已登陆的角色。 未登陆的指定角色用来选择各种角色,然后以该角色登陆,然后授权。
舔信封的MAN 2020-11-16
  • 打赏
  • 举报
回复
我也遇到类似问题了感谢博主写了这篇帖子,有个问题能解释一下CbRole这个类吗,我想了解一下如果指定角色不是null后,是如何操作的
韩_师兄 2020-11-16
  • 打赏
  • 举报
回复
厉害,学习了.shiro的多种操作.
banditgao 2019-10-12
  • 打赏
  • 举报
回复
解决了,先让用户认证,授权时赋给一个虚拟角色(无任何菜单和权限),仅仅用来登入,叫default. 甚至不需要这样一条角色数据。 然后让用户选角色。 用Session传递用户所选的角色 LoginController
Long targetRoleId = Long.parseLong(map.get("roleId"));// 选的
subject.getSession().setAttribute("targetRoleId", targetRoleId);//放入Session
MyShiroRealm 的 doGetAuthorizationInfo()


Subject subject = SecurityUtils.getSubject();
			Object targetRoleId = subject.getSession().getAttribute("targetRoleId");

			// CbStaff cbStaff = (CbStaff) principals.getPrimaryPrincipal();
			CbRole cbRole = null;
			if (targetRoleId != null)// 指定角色
			{
				cbRole = roleRepo.getOne(Long.parseLong(targetRoleId.toString()));
				authorizationInfo.addRole(cbRole.getRoleCode());
				Set<CbRoleResource> resSet = cbRole.getCbRoleResources();
				Iterator<CbRoleResource> resIt = resSet.iterator();
				while (resIt.hasNext())
				{
					CbResource res = resIt.next().getCbResource();
					if (res.getResourceType() > 1 && StringUtils.isNotEmpty(res.getPermission()))// 子菜单
						authorizationInfo.addStringPermission(res.getPermission());
				}
			}
			else// 默认角色
			{
				cbRole = roleRepo.findByRoleCode("default");
				authorizationInfo.addRole("default");
			}

这样,甚至可以实现应用内切换角色,各处的权限验证也是符合所选角色的,我试过了。
banditgao 2019-10-06
  • 打赏
  • 举报
回复
引用 4 楼 NANU-NANA 的回复:
[quote=引用 3 楼 banditgao 的回复:] [quote=引用 1 楼 dkwuxiang 的回复:] 在 shiro 登录校验的时候,AuthorizingRealm 的 doGetAuthorizationInfo()中 的 AuthorizationInfo 这里是配置当前用户的相关信息的 AuthorizationInfo对象.addRole(选定的角色); 这样只添加指定的选定的对象,其他配置不动, 是不是你想要的结果?
能不能先给用户登录某一个角色(一个只有默认菜单的角色), 等用户选择完他想登的角色,我再用这个角色给他登录一次。 允许登录后再次登录吗?这要怎么做呢?谢谢[/quote] 就是加一个default角色,这个role是不用选的,直接默认显示。[/quote] 呦,版主吉祥😊
NANU-NANA 2019-10-04
  • 打赏
  • 举报
回复
引用 3 楼 banditgao 的回复:
[quote=引用 1 楼 dkwuxiang 的回复:] 在 shiro 登录校验的时候,AuthorizingRealm 的 doGetAuthorizationInfo()中 的 AuthorizationInfo 这里是配置当前用户的相关信息的 AuthorizationInfo对象.addRole(选定的角色); 这样只添加指定的选定的对象,其他配置不动, 是不是你想要的结果?
能不能先给用户登录某一个角色(一个只有默认菜单的角色), 等用户选择完他想登的角色,我再用这个角色给他登录一次。 允许登录后再次登录吗?这要怎么做呢?谢谢[/quote] 就是加一个default角色,这个role是不用选的,直接默认显示。
banditgao 2019-10-01
  • 打赏
  • 举报
回复
引用 1 楼 dkwuxiang 的回复:
在 shiro 登录校验的时候,AuthorizingRealm 的 doGetAuthorizationInfo()中 的 AuthorizationInfo 这里是配置当前用户的相关信息的 AuthorizationInfo对象.addRole(选定的角色); 这样只添加指定的选定的对象,其他配置不动, 是不是你想要的结果?
能不能先给用户登录某一个角色(一个只有默认菜单的角色), 等用户选择完他想登的角色,我再用这个角色给他登录一次。 允许登录后再次登录吗?这要怎么做呢?谢谢
banditgao 2019-09-30
  • 打赏
  • 举报
回复
我试试楼上的
dkwuxiang 2019-09-26
  • 打赏
  • 举报
回复
在 shiro 登录校验的时候,AuthorizingRealm 的 doGetAuthorizationInfo()中 的 AuthorizationInfo 这里是配置当前用户的相关信息的 AuthorizationInfo对象.addRole(选定的角色); 这样只添加指定的选定的对象,其他配置不动, 是不是你想要的结果?

67,549

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧