好好编程-物流项目14【授权管理-shiro实现】

举报
波波烤鸭 发表于 2022/03/29 23:54:46 2022/03/29
【摘要】   上篇文章实现类基于Shiro的认证操作,本文来实现下授权操作。 授权 Shiro授权原理及细节内容欢迎参考如下链接 https://dpb-bobokaoya-sm.blog.csdn.ne...

  上篇文章实现类基于Shiro的认证操作,本文来实现下授权操作。

授权

Shiro授权原理及细节内容欢迎参考如下链接


https://dpb-bobokaoya-sm.blog.csdn.net/article/details/86652418


1.获取用户对应的权限

  本项目中我们的权限就只涉及到角色,没有再细粒度到菜单,感兴趣的可以自己可扩展实现下。
IUserService方法

	
/**
 * 根据用户编号获取对应的权限信息
 * @param userId
 * @return
 */
public List<Role> queryRoleByUserId(int userId);

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

UserServiceImpl实现

@Override
public List<Role> queryRoleByUserId(int userId) {
	
	return roleMapper.queryRoleByUserId(userId);
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5

RoleMapper接口中定义方法

List<Role> queryRoleByUserId(int userId);

  
 
  • 1

RoleMapper映射文件中添加sql

<select id="queryRoleByUserId" resultMap="BaseResultMap">
	select * 
	from t_role t1 
	where t1.role_id in (
		select role_id from t_user_role where user_id = #{id}
	)
</select>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

2.授权方法

  修改MyRealm中授权的方法

/**
 * 授权的方法
 */
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {
	// 获取认证的信息
	User user = (User) principals.getPrimaryPrincipal();
	// 获取登录用户对应的权限
	List<Role> roles = userService.queryRoleByUserId(user.getUserId());
	SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
	for (Role role : roles) {
		// 将用户具有的角色保存到SimpleAuthorizationInfo对象中
		info.addRole(role.getRoleName());
	}
	return info;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

3.SpringMVC添加配置

<!-- 开启Shiro注解 -->
<aop:config proxy-target-class="true"></aop:config>
<bean
	class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
	<property name="securityManager" ref="securityManager" />
</bean>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

4.数据准备

  创建一个账号分配对应的角色用来测试。
在这里插入图片描述

在这里插入图片描述

5.限制权限

// 当前登录用户需要"管理员角色才能访问"
@RequiresRoles("管理员")
@RequestMapping("/queryPage")
public String queryPage(UserDto dto,Model model){
	PageInfo<User> pageModel = userService.queryPage(dto);
	model.addAttribute("pageModel", pageModel);
	return "user/user";
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

用没有"管理员"角色的访问测试
在这里插入图片描述

用具有访问权限的账号登录
在这里插入图片描述
有权的访问成功。

解决没有访问权限的跳转问题。
新建一个没有权限的跳转页面

<%@ page language="java" contentType="text/html; charset=UTF-8"
	pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>无标题文档</title>
<link href="css/style.css" rel="stylesheet" type="text/css" />
<script type="text/javascript" src="js/jquery.js"></script>

<script language="javascript">
	$(function() {
		$('.error').css({
			'position' : 'absolute',
			'left' : ($(window).width() - 490) / 2
		});
		$(window).resize(function() {
			$('.error').css({
				'position' : 'absolute',
				'left' : ($(window).width() - 490) / 2
			});
		})
	});
</script>
</head>
<body style="background: #edf6fa;">
	<div class="place">
		<span>位置:</span>
		<ul class="placeul">
			<li><a href="#">首页</a></li>
			<li><a href="#">没有访问权限提示</a></li>
		</ul>
	</div>
	<div class="error">
		<h2>非常遗憾,您没有权限访问该页面!</h2>
		<p>看到这个提示,就自认倒霉吧!</p>
		<div class="reindex">
			<a href="/main" target="_parent">返回首页</a>
		</div>
	</div>
	<div style="display: none">
		<script src='http://v7.cnzz.com/stat.php?id=155540&web_id=155540'
			language='JavaScript' charset='gb2312'></script>
	</div>
</body>
</html>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45

SpringMVC中配置

<!-- shiro为集成springMvc 拦截异常 -->
<bean
	class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
	<property name="exceptionMappings">
		<props> <!-- 这里你可以根据需要定义N多个错误异常转发 -->
			<prop key="org.apache.shiro.authz.UnauthorizedException">redirect:/failed</prop>
			<prop key="org.apache.shiro.authz.UnauthenticatedException">redirect:/login.jsp</prop> 
			<!--<prop key="java.lang.IllegalArgumentException">redirect:/error.jsp</prop> 
				参数错误(bizError.jsp) --> 
			<!--<prop key="java.lang.Exception">redirect:/error.jsp</prop> 其他错误为'未定义错误'(unknowError.jsp) -->
		</props>
	</property>
</bean>

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

用没有权限的账号测试
在这里插入图片描述

权限标签在具体的业务场景中使用~

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/88750274

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。