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

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

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

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

...全文
3371 点赞 收藏 9
写回复
9 条回复
banditgao 2020年11月24日
引用 7 楼 舔信封的MAN 的回复:
我也遇到类似问题了感谢博主写了这篇帖子,有个问题能解释一下CbRole这个类吗,我想了解一下如果指定角色不是null后,是如何操作的
cbRole 就是个实体啊,只有两种选择,不是未登陆的指定角色,就是已登陆的角色。 未登陆的指定角色用来选择各种角色,然后以该角色登陆,然后授权。
回复 点赞
舔信封的MAN 2020年11月16日
我也遇到类似问题了感谢博主写了这篇帖子,有个问题能解释一下CbRole这个类吗,我想了解一下如果指定角色不是null后,是如何操作的
回复 点赞
厉害,学习了.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(选定的角色); 这样只添加指定的选定的对象,其他配置不动, 是不是你想要的结果?
回复 点赞
发动态
发帖子
Java EE
创建于2007-09-28

3.7w+

社区成员

22.5w+

社区内容

J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区公告
暂无公告