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

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


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

授权

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

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

1.获取用户对应的权限

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

IUserService方法

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

UserServiceImpl实现

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

RoleMapper接口中定义方法

List<Role> queryRoleByUserId(int userId);

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>

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;
}

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>

4.数据准备

 创建一个账号分配对应的角色用来测试。

image.png

image.png

5.限制权限

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

用没有"管理员"角色的访问测试

image.png

用具有访问权限的账号登录

image.png

有权的访问成功。

解决没有访问权限的跳转问题。

新建一个没有权限的跳转页面

<%@ 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>

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>

用没有权限的账号测试

image.png

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


相关文章
|
6月前
|
XML 存储 安全
【揭秘SAML协议 — Java安全认证框架的核心基石】 从初识到精通,带你领略Saml协议的奥秘,告别SSO的迷茫与困惑
SAML(Security Assertion Markup Language)是由OASIS制定的基于XML的开放标准。它用于在身份提供者(IdP)和服务提供者(SP)之间交换身份验证和授权数据,从而支持跨域单点登录,提高身份认证和授权管理的安全性和效率。
482 2
【揭秘SAML协议 — Java安全认证框架的核心基石】 从初识到精通,带你领略Saml协议的奥秘,告别SSO的迷茫与困惑
|
5月前
|
监控 安全 Java
老程序员分享:JeeSite快速开发平台、功能介绍、用户权限、数据权限、系统管理
老程序员分享:JeeSite快速开发平台、功能介绍、用户权限、数据权限、系统管理
176 0
|
5月前
|
数据安全/隐私保护
杨校老师课堂之权限管理系统的核心业务逻辑接口设计
杨校老师课堂之权限管理系统的核心业务逻辑接口设计
30 0
|
6月前
|
JavaScript 小程序 Java
高校宣讲会管理系统|基于Springboot的高校宣讲会管理系统设计与实现(源码+数据库+文档)
高校宣讲会管理系统|基于Springboot的高校宣讲会管理系统设计与实现(源码+数据库+文档)
47 1
|
6月前
|
JavaScript 小程序 Java
大学生租房系统|基于SpringBoot的大学生租房系统设计与实现(源码+数据库+文档)
大学生租房系统|基于SpringBoot的大学生租房系统设计与实现(源码+数据库+文档)
72 0
|
6月前
|
JavaScript Java 数据库
考勤|基于Springboot的大学生考勤系统设计与实现(源码+数据库+文档)
考勤|基于Springboot的大学生考勤系统设计与实现(源码+数据库+文档)
122 0
|
6月前
|
JSON 安全 算法
【揭秘OIDC协议 — Java安全认证框架的核心基石】 从初识到精通,带你领略OIDC协议的奥秘,告别SSO的迷茫与困惑
【揭秘OIDC协议 — Java安全认证框架的核心基石】 从初识到精通,带你领略OIDC协议的奥秘,告别SSO的迷茫与困惑
242 0
|
6月前
|
小程序 JavaScript IDE
【社区每周】如何实现小程序代码热更新?芝麻工作证新增“企业员工”职业身份验证(1月第四期)
【社区每周】如何实现小程序代码热更新?芝麻工作证新增“企业员工”职业身份验证(1月第四期)
58 0
|
6月前
|
JavaScript 小程序 Java
基于Java的高校科研信息管理系统设计与实现(亮点:完整严谨的科研项目审批流程、多文件上传、多角色)
基于Java的高校科研信息管理系统设计与实现(亮点:完整严谨的科研项目审批流程、多文件上传、多角色)
133 0
|
6月前
|
JavaScript 小程序 Java
基于Java的养老院管理系统的设计与实现(亮点:多角色、登录验证码、留言反馈)
基于Java的养老院管理系统的设计与实现(亮点:多角色、登录验证码、留言反馈)
65 0
下一篇
无影云桌面