共计 2000 个字符,预计需要花费 5 分钟才能阅读完成。
Shiro 应用业务受权
业务受权中关系到几个表中的对应关系,要依据用户的角色是什么,角色的权限有哪些来给用户调配权限。
1、配置文件
在 SpringShiroConfig(见认证文章)中配置 advisor 对象如下内容:
shiro 框架底层会依据此对象的 matchs 返回值判断是否创立代理对象。
@Bean
public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {AuthorizationAttributeSourceAdvisor advisor = new AuthorizationAttributeSourceAdvisor();
advisor.setSecurityManager(securityManager);
return advisor;
}
2、dao 层
基于用户的登陆信息,获取用户的权限信息
- 依据用户 id 查找角色 id 信息;在 UserRoleDao 中增加一下代码:
List<Integer> findRoleIdsByUserId(Integer id);
- 映射文件
<select id="findRoleIdsByUserId" resultType="int">
select role_id from
sys_user_roles where user_id=#{id}
</select>
- 依据查到的角色 ids 查问菜单 ids
List<Integer> findMenuIdsByRoleIds(Integer[] roleIds);
- 映射文件
<select id="findMenuIdsByRoleIds" resultType="int">
select menu_id from sys_role_menus
where role_id in
<foreach collection="roleIds" item="role_id" open="("
close=")" separator=",">
#{role_id}
</foreach>
</select>
- 在依据查到的菜单 ids 查找权限标识办法
List<String> findPermissions(Integer[] menuIds);
<select id="findPermissions" resultType="string">
select premission from sys_menus
where id in
<foreach collection="menuIds" item="menuid" open="(" close=")" separator=",">
#{menuid}
</foreach>
</select>
3、重写 ShiroUserRealm 中的受权办法
/**
* 受权
*/
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
// 1. 获取用户登陆信息
SysUser user = (SysUser) principals.getPrimaryPrincipal();
Integer id = user.getId();
// 2. 基于用户 id 查问领有的角色 id
List<Integer> roleIds = sysUserRolesMapper.findRoleIdsByUserId(id);
// 3。基于角色 id 查找菜单 id
List<Integer> menuIds = sysRoleMenuMapper.findMenuIdsByRoleIds(roleIds);
// 4。基于菜单 id 获取权限标识符
List<String> premissions = sysMenuMapper.findPermissions(menuIds);
// 5. 封装权限标识符并返回
Set<String> set = new HashSet<>();
for (String pre : premissions) {if (!StringUtils.isEmpty(pre)) {set.add(pre);
}
}
SimpleAuthorizationInfo info = new SimpleAuthorizationInfo(set);
return info;
}
4、增加注解 @RequiresPermissions(“权限标识”)
在须要进行受权拜访的业务层(Service)办法上,增加执行此办法须要的权限标识,参考代码阐明:此要注解肯定要增加到业务层办法上。
在日志查看上增加注解 @RequiresPermissions(“sys:log:view”);
示意被这个注解形容的业务,只有有相应权限标识的角色的用户能力应用此权限。
当我用一个没有查看日志权限的用户登录时,就不能看到日志信息,更不能对其进行操作!
正文完