上篇文章实现类基于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.数据准备
创建一个账号分配对应的角色用来测试。
5.限制权限
// 当前登录用户需要"管理员角色才能访问" @RequiresRoles("管理员") @RequestMapping("/queryPage") public String queryPage(UserDto dto,Model model){ PageInfo<User> pageModel = userService.queryPage(dto); model.addAttribute("pageModel", pageModel); return "user/user"; }
用没有"管理员"角色的访问测试
用具有访问权限的账号登录
有权的访问成功。
解决没有访问权限的跳转问题。
新建一个没有权限的跳转页面
<%@ 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>
用没有权限的账号测试
权限标签在具体的业务场景中使用~